
Java虚拟机
林郎俊赏
忘记呼吸也不要忘记梦想
展开
-
Java虚拟机—运行时数据区—堆
虚拟机的方法区和堆空间,是每个线程共用的,其他数据区为每个线程私有,私有数据区颗粒度较细,难有优化的空间。而共用的数据区,内存分配时能得到较多的内存,所以该数据区是GC时的重点。堆在JVM启动时被创建,大小也随之确定,是JVM最大、最重要的一块内存空间。堆在物理上不连续,而在逻辑上连续。虽然堆是每个线程共享,但也可以划分线程私有的缓冲区。几乎所有的对象实例和数组都分配在堆中,少部分分配在栈中。对象和数组可能永远不会存储在栈上,栈帧中仅保存引用,而这引用指向堆中的位置。在栈帧结束后,堆中的对象不会马上被移原创 2020-11-15 23:12:06 · 185 阅读 · 0 评论 -
Java虚拟机—堆的常用参数
-XX:PrintFlagsInitial,查看所有参数的默认初始值-XX:+PrintGCDetails,查看GC的详细处理日志-XX:+PrintGC,查看GC的简要信息-XX:PrintFlagsFinal,查看所有参数的最终值-Xms,初始堆内存的空间-Xmx,最大堆内存的空间-Xmn,新生代默认值及最大值的大小-XX:NewRatio,新生代和老年代在堆重的占比-XX:SurvivorRatio,设置Eden和S区的比例-XX:MaxTen..原创 2020-11-15 23:10:30 · 185 阅读 · 0 评论 -
Java中的对象都分配在堆中?
Java中的对象可以不分配在堆中,因为还存在栈上分配、同步省略和标量替换三种技术都需要使用逃逸分析逃逸分析,是一种可以有效减少Java程序中同步负载和堆分配压力的跨函数全局数据流分析算法。当一个对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸;如果对象被外部对象引用,则认为发生逃逸。通过逃逸分析,HotSpot编译器能够分析出一个新对象的使用范围,从而决定是否将这个对象分配到堆上。栈上分配栈上分配所指的栈,是Java方法对应的栈帧。没有发生逃逸的对象可能被优化分配到栈上,因为随原创 2020-11-15 23:07:54 · 667 阅读 · 0 评论 -
Java虚拟机—运行时数据区—本地方法栈
本地方法接口由native修饰的方法就是本地方法。该方法的实现不是由Java编写,用以融合C/C++的程序。在开发过程中,有时需要与外部系统进行交互,JDK提供的接口不足以满足需求,这是本地方法存在的主要原因;另外,操作系统由C语言编写,通过本地方法可以实现与操作系统的交互;JDK的部分功能需要由操作系统底层的函数提供;本地方法栈:虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有。栈大小可以固定也可以动态扩展,内存溢出方面与虚拟机栈相同。当本地方原创 2020-11-03 23:20:08 · 115 阅读 · 0 评论 -
Java虚拟机—运行时数据区—虚拟机栈3—栈帧的内部结构
栈帧是一个内存区块,是一个数据集,维系着方法执行过程中的各种数据。正在执行的方法对应的栈帧称为当前栈帧。执行引擎的所有字节码指令只针对栈帧进行操作。如果当前栈帧调用了新的方法,那么新的方法对应的栈帧会被创建出来并压入栈中成为新的栈帧。JAVA方法有两种返回函数的方式,一种是正常的函数返回,使用return指令;另一种是抛出异常;不管是哪种方式,都会导致栈帧被弹出。栈帧内部结构局部变量表: 存在于每个线程的每个栈的每个栈帧中,不存在线程安全的问题。定义为一个数字数组,主要用于存储方法参数和定义原创 2020-11-03 00:08:37 · 301 阅读 · 0 评论 -
Java虚拟机—运行时数据区—PC寄存器(程序计数器)
PC寄存器是对物理的寄存器的抽象模拟,存在于内存中的数据结构,无物理实体,CPU只有把数据装在到寄存器上才能运行。PC寄存器存储指向下一条指令的地址。由执行引擎读取下一条指令。PC寄存器会存储当前线程正在执行的Java方法的JVM指令地址,如果该方法为native方法,则是undefined。该数据区不会OOM。使用PC寄存器存储字节码指令地址有什么用呢?CPU需要不断切换各个线程,在切换回来的时候,需要知道从哪接着开始。JVM字节码解释器需要通过PC寄存器的值来明确下一条该执行什么样的字节原创 2020-11-02 23:42:51 · 197 阅读 · 0 评论 -
Java虚拟机—运行时数据区—虚拟机栈2—方法的调用
链接方式、方法绑定、(非)虚方法方法的绑定有两种,分别为早期绑定和晚期绑定,静态链接对应早期绑定,动态链接对应晚期绑定。绑定是一个字段、方法或者类在符号引用被替换为直接引用的过程,该过程仅发生一次。静态链接、早期绑定、非虚方法静态链接:当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译器可知,且运行期保持不变时,这种情况将调用方法的符号引用转换为直接引用的过程称之为静态链接。早期绑定:是指被调用的方法如果在编译期可知,且运行期保持不变时,即可将这个方法与所属类型进行绑定。在子类中原创 2020-11-02 23:16:45 · 152 阅读 · 0 评论 -
Java虚拟机—运行时数据区-虚拟机栈1—栈的基本内容
不同CPU的架构不同,基于寄存器则对CPU的耦合比较高。虚拟机栈的指令集小,方便编译器解释,更容易实现跨平台的特性。但缺点也很明显,性能比寄存器要差很多。栈是运行时的单位,而堆是存储的单位。栈解决程序如何执行,如何处理数据,而堆解决数据怎么放,放哪的问题。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个栈帧,一个栈帧对应一次方法调用。主管JAVA程序的运行,保存方法的局部变量(基本数据类型和对象的引用地址)、部分结果,并参与方法的调用和返回。栈的特点栈是一种快速有效的分配存储方式,访原创 2020-11-01 23:38:03 · 122 阅读 · 0 评论