首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入理解java虚拟机

以上问题在《深入理解java虚拟机》这本书里都有详尽的解答。...虚拟机栈 线程私有, 生命周期与线程相同 描述java方法执行的内存模型:每个方法都会创建一个栈帧用于存储局部变量,方法出口,操作数栈等信息。...对应java代码为:new,设置静态字段,调用静态方法 java.lang.reflect包对类进行反射时 初始化一个类时,如果父类还没有被初始化时初始化父类(接口没有这个要求) 虚拟机启动时,主类(main...运行时栈结构 1.1 概述 支持方法调用和执行的数据结构 处于jvm内存模型中的java虚拟机栈区域 存储了局部变量表,操作数栈,动态连接,方法返回地址等信息 每个方法的调用都对应虚拟机栈的入栈到出栈过程...方法调用 2.1 解析 2.2 分派 静态分派 动态分派 单分派和多分派 虚拟机动态分派实现 3. 方法的执行 解释执行 编译执行 九. java内存模型 1.

55751

深入理解Java虚拟机》笔记

那么上面这段代码是不是相当于最简单的一个虚拟机了?下面来看JVM的总体结构: ?...具体单个方法的执行非常简单,写一个简单的程序然后使用javap -c,再结合每条指令的含义就能大概知道程序时怎么执行以及返回的了(大体上就是基于栈),这里就不深入和细说了。...Java虚拟机中最轻量级的同步机制:volatile,它的性质如下: 变量发生修改的时候会立刻被其他线程看到; 禁止指令重排序优化; 从Java内存模型操作的角度来看volatile的实现还是挺简单的...实现线程主要有几种方式: 使用一个内核线程(轻量级进程)来代理; 完全在用户态实现,内核都感觉不到; 用户和内核混合实现,各自做自己擅长的事情; 这里就不深入的去看了(虽然这里的介绍根没说一样),想想看都知道不同虚拟机在不同的操作系统上面的实现方式很可能是不一样...,如果想深入看还是pthread比较有意思一点。

33610
您找到你想要的搜索结果了吗?
是的
没有找到

深入Java虚拟机——JVM内存详解

在C++中,程序员拥有每一个对象的所有权,但与此同时还肩负着释放对象内存空间的责任;而Java由于有了虚拟机的帮助,程序员拥有对象的所有权的同时不再需要释放对象的内存空间。...Java虚拟机在运行时将内存空间分成5个部分,分别是:方法区、虚拟机栈、本地方法栈、堆、程序计数器。 程序计数器 本质 程序计数器本质上是一块较小的内存空间。...若线程正在执行的是一个Java方法,那么当前线程的程序计数器记录的是正在执行的虚拟机字节码指令的地址;若线程正在执行的是一个Native方法,则这个计数器值为空。...PS:Native方法是指不使用Java语言写的方法,或者是使用Java语言写的直接操控计算机硬件的方法。 Java虚拟机栈 是什么? JVM栈是用来描述Java方法执行过程的一个内存模型。...Java虚拟机栈可能可能产生的异常 若线程请求的栈深度大于虚拟机所允许的最大深度,就抛出StackOverFlow异常; 若虚拟机栈可以动态扩展,没有最大深度的限制,当内存已经用完,无法再扩展栈深度时

619130

深入理解JAVA虚拟机《一》

2.Java虚拟机栈(线程私有) 描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等。...3.本地方法栈(线程私有) 与虚拟机栈所发挥的作用是非常相似的,他们之间的区别的不过是本地方法栈则为虚拟机使用到的Native方法服务,虚拟机栈为虚拟机执行的Java方法(字节码)服务。...4.Java堆(线程共享) 此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都要在这分配内存管理。 Java堆是垃圾收集器管理的主要区域,也称为GC堆。...提高了性能,避免在Java堆和Native堆中来回赋值数据。 本机直接内存的分配不受到Java堆大小的限制,但是会受到本机总内存大小以及处理器寻址空间的限制。...虚拟机栈和本地方法栈溢出 关于虚拟机栈和本地方法栈,在Java虚拟机规范中描述了这两种异常: 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出Stack OverflowError异常。

17400

深入浅出java虚拟机

Java虚拟机:内存模型详解 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?...当我们创建一个对象实例的时候,虚拟机要为对象分配内存,Java虚拟机又是如何配分内存的呢?这些都涉及到Java虚拟机的内存划分机制,今天我们就来探究一下Java虚拟机的内存模型。...根据Java虚拟机规范的规定,Java虚拟机所管理的内存包括以下几个数据区域。如下图所示: ? 以上就是Java虚拟机运行时数据区域的划分,每一块内存区域都有它的职责,存放着不同的运行时数据。...在Java虚拟机规范中并没有对本地方法栈的实现做强制规定,有的虚拟机甚至直接把虚拟机栈和本地方法栈合二为一。 堆 Java堆是所有线程所共享的一块内存区域,也是Java虚拟机所管理的内存中最大的一块。...以上就是Java虚拟机的内存模型划分,这是我们程序猿必须掌握的原理,弄清Java虚拟机的内存模型,是理解虚拟机内存分配和垃圾回收的基础,以此作为总结。 Java虚拟机:如何判定哪些对象可回收?

39720

深入Java虚拟机|类加载机制

加载阶段完成后,虚拟机外部的 二进制字节流就按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个java.lang.Class类的对象,这样便可以通过该对象访问方法区中的这些数据。...对于任意一个类,都需要由它的类加载器和这个类本身一同确定其在就Java虚拟机中的唯一性,也就是说,即使两个类来源于同一个Class文件,只要加载它们的类加载器不同,那这两个类就必定不相等。...站在Java虚拟机的角度来讲,只存在两种不同的类加载器:启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有很多其他的虚拟机是用Java语言实现的),是虚拟机自身的一部分...所有其他的类加载器:这些类加载器都由Java语言实现,独立于虚拟机之外,并且全部继承自抽象类java.lang.ClassLoader,这些类加载器需要由启动类加载器加载到内存中之后才能去加载其他的类。...因此,在虚拟机中第一个被执行的()方法的类肯定是java.lang.Object。

35320

深入Java虚拟机——JVM内存详解

在C++中,程序员拥有每一个对象的所有权,但与此同时还肩负着释放对象内存空间的责任;而Java由于有了虚拟机的帮助,程序员拥有对象的所有权的同时不再需要释放对象的内存空间。...Java虚拟机在运行时将内存空间分成5个部分,分别是:方法区、虚拟机栈、本地方法栈、堆、程序计数器。 程序计数器 本质 程序计数器本质上是一块较小的内存空间。...若线程正在执行的是一个Java方法,那么当前线程的程序计数器记录的是正在执行的虚拟机字节码指令的地址;若线程正在执行的是一个Native方法,则这个计数器值为空。...PS:Native方法是指不使用Java语言写的方法,或者是使用Java语言写的直接操控计算机硬件的方法。 Java虚拟机栈 是什么? JVM栈是用来描述Java方法执行过程的一个内存模型。...Java虚拟机栈可能可能产生的异常 若线程请求的栈深度大于虚拟机所允许的最大深度,就抛出StackOverFlow异常; 若虚拟机栈可以动态扩展,没有最大深度的限制,当内存已经用完,无法再扩展栈深度时

872120

Java面试宝典】深入理解JAVA虚拟机

1.2 Java虚拟机虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于储存局部变量表、操作数栈、动态链接、方法出口 等信息。...1.3 本地方法栈   本地方法栈和虚拟机栈发挥的作用是非常类似的,他们的区别是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法(Native Method...1.4 Java堆 堆是Java虚拟机所管理的内存中最大的一块。...1.7 直接内存 直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。   ...五、虚拟机类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

58110

深入理解Java虚拟机》(一)Java虚拟机发展史

Java虚拟机发展史 注:本文大部分摘自《深入理解Java虚拟机(第二版)》 作为一名Java开发人员,不能局限于Java语言规范,更需要对Java虚拟机规范有所了解。...Java虚拟机规范有多种实现,其中HotSpot VM是Oracle JDK和Open JDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。...:号称世界上最快的Java 虚拟机 5.目前最流行的Java 虚拟机: 1....Zing VM 推荐阅读 《深入理解Java虚拟机》(一)Java虚拟机发展史 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区 《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略 《深入理解...Java虚拟机》(四)虚拟机性能监控与故障处理工具 《深入理解Java虚拟机》(五)JVM调优 - 工具 《深入理解Java虚拟机》(六)堆内存使用分析,GC 日志解读 Contact 作者:鹏磊 出处

613100

深入理解Java虚拟机Java垃圾回收器

目前比较前沿的成果… 一、Jvm 垃圾回收器概述 我们前面提到了,垃圾回收器的 回收的内容、回收的时机以及回收的方式,接下来我们来看 Java 垃圾回收器。...虽然 Serial 收集器是最基础最老的收集器,但是迄今为止 HotSpot 虚拟机运行在 Client 模式下的默认的新生代垃圾收集器!...Parallel Scavenge 的特点是其关注重点为吞吐量,高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算,但也就是说它的线程单次停止时间可能更长,因此适用于后台计算型任务程序: Ps:如果虚拟机完成某个任务...运行垃圾回收时间 ---- 三、老年代回收器 1、Serial Old 收集器 Serial Old 是 Serial 收集器的老年代版本,采用“标记-整理”算法,单线程收集器,也是给 Client 模式下的虚拟机使用...VM(-client),为在客户端环境中减少启动时间而优化; Java HotSpot Server VM(-server),为在服务器环境中最大化程序执行速度而设计。

55520

深入理解Java虚拟机-虚拟机执行子系统

深入理解Java虚拟机》全书总结如下: 序号 内容 链接地址 1 深入理解Java虚拟机-走近Java https://blog.csdn.net/ThinkWon/article/details/103804387...2 深入理解Java虚拟机-Java内存区域与内存溢出异常 https://blog.csdn.net/ThinkWon/article/details/103827387 3 深入理解Java虚拟机...字节码指令简介 感兴趣的小伙伴可以自行阅读《深入理解Java虚拟机》 公有设计和私有实现 感兴趣的小伙伴可以自行阅读《深入理解Java虚拟机》 Class文件结构的发展 感兴趣的小伙伴可以自行阅读《深入理解...破坏双亲委派模型 感兴趣的小伙伴可以自行阅读《深入理解Java虚拟机》 字节码执行引擎 概述 执行引擎是 Java 虚拟机最核心的组成部分之一。...基于栈的解释器执行过程 感兴趣的小伙伴可以自行阅读《深入理解Java虚拟机》 类加载及执行子系统的案例与实战 感兴趣的小伙伴可以自行阅读《深入理解Java虚拟机

30520

深入理解Java虚拟机(高效并发)

2Java 内存模型 Java 虚拟机规范中定义了 Java 内存模型,用来屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。...对 volatile 型变量的特殊规则 volatile 是 Java 虚拟机提供的最轻量级的同步机制。...3 Java 与线程 谈论 Java 中的并发,通常都是和多线程相关的。这一小节我们就讲讲 Java 线程在虚拟机中的实现。...因此,在目前的 JDK 版本中,操作系统支持怎样的线程模型,在很大程度上决定了 Java 虚拟机的线程是怎样映射的,这点在不同的平台上没有办法达成一致,虚拟机规范中也没有限定 Java 线程需要使用哪种线程模型来实现...想进一步 Java 虚拟机的同学推荐去阅读周志明老师的原著。

38120

java(5)-深入理解虚拟机JVM

3、JVM、JRE和JDK的关系 JVM:Java Virtual Machine是Java虚拟机Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。...如果线程请求分配的栈容量超过 Java 虚拟机栈允许的最大容量,Java 虚拟机将会抛出一个 StackOverflowError 异常 如果 Java 虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存...以上描述截取自: 《深入理解Java虚拟机:JVM高级特性与最佳实践》 作者: 周志明 五、Java 8: 从永久代(PermGen)到元空间(Metaspace) ---- 1、 从永久代(...Sun JDK采用了token-threading的方式,感兴趣的同学可以深入了解一下。...xxd -r转换回来 通过javap来看一下它的结构 八、垃圾收集(Garbage Collect) ---- 具体看《java(9)-深入浅出GC垃圾回收机制》 Java中不需要对内存进行手动释放

64010

Java 虚拟机深入理解Java虚拟机是怎么实现synchronized的?

说完抽象的锁算法,下面我们便来介绍 HotSpot 虚拟机中具体的锁实现。 重量级锁 重量级锁是 Java 虚拟机中最为基础的锁实现。...Java 虚拟机也存在着类似的情形:多个线程在不同的时间段请求同一把锁,也就是说没有锁竞争。针对这种情形,Java 虚拟机采用了轻量级锁,来避免重量级锁的阻塞以及唤醒。...此时,Java 虚拟机会将锁记录清零,以代表该锁被重复获取。第二,其他线程持有该锁。此时,Java 虚拟机会将这把锁膨胀为重量级锁,并且阻塞当前线程。...当设置偏向锁时,Java 虚拟机需要将该 epoch 值复制到锁对象的标记字段中。 在宣布某个类的偏向锁失效时,Java 虚拟机实则将该类的 epoch 值加 1,表示之前那一代的偏向锁已经失效。...如果总撤销数超过另一个阈值(对应 Java 虚拟机参数 -XX:BiasedLockingBulkRevokeThreshold,默认值为 40),那么 Java 虚拟机会认为这个类已经不再适合偏向锁。

53871

深入理解Java虚拟机:垃圾收集

虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因时它很难解决对象之间相互循环引用的问题。...在Java语言中,可作为 GC Roots 的队形包括下面几种: 虚拟机栈(帧栈中的本地变量表)中引用的对象。 方法区中类静态属性引用的对象。 方法区中常量引用的对象。...当对象没有覆盖 fianlize() 方法,或者 fianlize() 方法已经被虚拟机调用过,虚拟机将这两种情况都视为 “没有必要执行”。...yes,i am still alive no,i am dead : ( ---- 回收方法区 很多人认为方法区(或者 HotSpot 虚拟机中的永久代)是没有垃圾收集的,Java 虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾手气...回收废弃常量与回收 Java 堆中的对象非常类似。

20720

深入Java虚拟机--判断对象存活状态

程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的。...但是,至少主流的Java虚拟机里面没有用到引用计数算法来管理内存,之中最主要的问题就是他很难解决对象之间相互循环引用的问题: public class ReferenceGc { public...中,这种情况是非常常见的,所以这种算法并不能解决Java中对象相互引用的问题,所以Java虚拟机判断对象存活状态的算法是选择了接下来介绍的--可达性分析算法。...首先,我们要规定好GC Roots的定义范围,并不是说所有的对象都能够成为GC Roots:  在Java 语言中,可作为GC Roots 的对象包括下面几种: - 虚拟机栈(栈帧中的本地变量表...)引用的对象 - 方法区中类静态属性引用的对象 - 方法区中常量引用的对象 - 本地方法栈中JNI引用的对象 对象在被回收前最后的自我救赎 上面我们说完了Java虚拟机中判断对象存活状态的算法

72770

深入了解Java虚拟机内存

作者:feifei 来自:http://itfeifei.win/2017/03/13/深入了解Java虚拟机内存/ 在讨论JVM内存区域分析之前,先来看一下Java程序具体执行的过程: ?...二、Java虚拟机Java虚拟机栈中存放的是一个个栈帧,当程序执行一个方法时,就会创建一个栈帧并压入栈中,当方法执行完毕之后,便会将栈帧移除栈。...在Java虚拟机规范中,对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展...,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。...三、本地方法栈、 本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的

31930

深入理解Java虚拟机–javac命令

src/*.java javac src/*Class.java 如果需要编译的 .java 源文件数量较多,为缩短和简化javac命令,可以把要编译的 .java 源文件的文件名(必要时包含路径)存储到一个文件中...要使用 a2.0.jar中的类G,a2.0.jar是a1.0.jar的升级包,当a1.0.jar,a2.0.jar都在CLASSPATH中,JDK搜索到第一个包中的类G时就停止搜索,如果应用1应用2的虚拟机都从...-target # 生成特定 VM 版本的类文件 -target 命令用于指定生成的class文件将保证和哪个版本的虚拟机进行兼容。...我们可以通过-target 1.2来保证生成的class文件能在1.2虚拟机上进行运行,但是1.1的虚拟机就不能保证了。...因为java虚拟机的向前兼容行,1.5的虚拟机当然也可以运行通过-target 1.2让生成的class文件。每个版本编译器的默认-target版本是不太一样的。

1.2K10
领券