Java虚拟机基础知识
目录
相关视频:
深入理解Java虚拟机(JVM性能调优+内存模型+虚拟机原理)
https://docs.oracle.com/javase/8/docs/
JVM简介
JVM是Java Virtual Machine(Java虚拟机)的缩写
常见的虚拟机有VMware,Virtual Box,Java Virtual Machine
Java虚拟机阵营:Sun HotSpot VM、BEA JRockit VM(java1.8之后与HotSpot合并了)、IBM J9 VM、
Apache Harmony、Google Dalvik VM、Microsoft JVM...
JVM由三个主要的子系统构成:
类加载器子系统
运行时数据区(内存结构)
执行引擎
JVM图解:
运行时数据区图解:
程序计数器:“线程私有”的内存,是一个较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器。Java虚拟机规范中唯一一个没有OutOfMemoryError情况的区域。字节码解释器工作时就说通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
Java虚拟机栈:Java 虚拟栈,线程私有的,它的生命周期与线程相同。每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。通过人们所说的“栈”就说虚拟机栈,或说是虚拟机栈中的局部变量表部分。
本地方法栈:本地方法栈作用与虚拟机栈相似,区别在于虚拟机栈为虚拟机执行java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务,线程私有。
Java堆(Java Heap):Java堆是Java虚拟机所管理的内存中最大的一块。在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
Java堆是垃圾收集器管理的主要区域,因此也称为“GC堆”;
如果在堆中没有内存完成实例分配,并且堆也无法扩展时,将会抛出OutOfMemoryError异常。
方法区:方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。
具体可见:Java内存区域与虚拟机类加载机制
堆:
新生代:
Eden空间
From Survivor空间
To Survivor空间
老年代:
方法区:
老年代(JDK < 1.8)
元空间(JDK >= 1.8)
对象优先在Eden分配
大对象直接进入老年代
长期存活的对象将进入老年代(对象存活的时间长短有一个参数:age 当age=15后,他就会进入老年代)
举例:一个object对象先进入Eden空间,此时age = 0,然后,在第一次垃圾回收中,如果它没有被回收,age=1,它就
从Eden空间进入From Survivor空间,在随后的的垃圾回收中,每当它不被回收一次,它的age就+1,同时它会在From Survivor和To Survivor 空间来回跳转,当它的age=15后,它就会被放入老年代中。
动态对象年龄判定
JVM中的垃圾回收(GC)
新生代:Minor GC(频次比较高)
老年代:Full GC
复制算法:
标记清除算法:
标记整理算法:
永久代会不会进行垃圾回收?
会,但是效率很低,条件也很严格。