1、总的JVM模型:

JVM深入理解_java

 

JVM的功能模块主要包括类加载器、执行引擎和垃圾回收系统。

java编译执行过程:源程序(.java文件)通过java编译器翻译成字节码(.class)文件,然后在方法区生成类的信息,之后通过类转载器,将class文件字节码内容加载到堆内存中,通过字节码校验器和解释器在堆中生成一个代表这个类的java.lang.class对象,最后执行引擎查找方法入口main(),执行其中的字节码指令。

 

2、虚拟机栈

每一个方法都会开辟一个栈帧

JVM深入理解_虚引用_02

 

 

3、程序计数器:

JVM深入理解_虚引用_03

 

如果正在执行的是 Native 方法,这个计数器的值则为 (Undefined)。此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。

 

4、1.7永久代1.8后的元空间

JDK7 之前(永久代)用于存储已被虚拟机加载的类信息、常量、字符串常量、类静态变量、即时编译器编译后的代码等数据。

jdk1.8后移除了(永久代)取代它的被称为元空间,
元空间和永久代的区别是:元空间不在虚拟机内存,使用的是本地内存(直接内存)

JVM深入理解_java_04

 

 

5、本地方法栈

JVM深入理解_数据_05

 

区别于 Java 虚拟机栈的是,Java 虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。也会有 StackOverflowError 和 OutOfMemoryError 异常。

 

6、虚拟机栈

6.1、局部变量表和操作数栈

JVM深入理解_虚引用_06

 

 

6.2、动态链接

句柄链接

句柄池实现思路

动态连接通过句柄池找到对象实例数据指针,对象类型数据指针。

通过实例对象数据指针找到实例对象数据。

通过对象类型数据指针找到对象类型的数据。

JVM深入理解_数据_07

 

直接连接

直接指针实现思路

动态连接从java堆的实例对象找到对象类型数据指针,

然后根据指针找到方法区对象类型的数据

JVM深入理解_软引用_08

 

 

比较:

使用句柄的最大好处是存储的是稳定的句柄地址,在对象移动(GC)是只改变实例数据指针地址, 自身不需要修改。

直接指针访问的最大好处是速度快,节省了一次指针定位的时间开销。

如果是对象频繁 GC 那么句柄方法好,如果是对象频繁访问则直接指针访问好。

 

6.3、方法出口

JVM深入理解_句柄_09

 

 

7、堆:

对象回收

JVM深入理解_数据_10

 

如何识别回收对像

JVM深入理解_软引用_11

 

 

8、栈中对象的引用:

普通对象

JVM深入理解_虚引用_12

 

打印new User的引用地址数据

JVM深入理解_java_13

 

JVM深入理解_数据_14

 

数组对象会多一个length

JVM深入理解_数据_15

 

打印10长的数组,分配10个空对象

JVM深入理解_java_16

 

 

关于对象头Mark Word(重)

JVM深入理解_java_17

 

 

9、Class的加载方式

JVM深入理解_软引用_18

 

双亲委派机制

JVM深入理解_软引用_19

 

 

 

10、对象的引用

对象的引用分为强引用,软引用,弱引用,虚引用

(1) 强引用 (Strong Reference)

当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError,也不会随意回收这个对象,如果不使用这个1对象的时候,可以显式它的引用赋值为null,这样就会被垃圾回收器回收。

(2) 软引用(Soft Reference)

如果一个对象只有软引用,如果内存空间足够,就不会回收它,如果内存空间不够,就会回收这部分内存,软引用可以和一个引用队列联合使用,如果软引用所引用的对象被回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

(3) 弱引用(Weak Reference)

只要发现只有弱引用的对象就会立即回收,eg.ThreadLocalMap

(4) 虚引用(Phantom Reference)

虚引用用来跟踪对象被垃圾回收器回收的活动。虚引用和软引用与弱引用的区别在于虚引用必须和引用队列联合使用,当虚引用被加入到引用队列的时候,说明这个对象已经被回收,可以在所引用的对象回收之后可以采取必要的行动。

 

2.3 GC算法

(1)标记清除算法:

分为标记和清除两个阶段,首先先标记所有要回收的对象,在标记完成之后统一回收被标记的对象。缺点是效率低和会产生大量不连续的内存碎片

JVM深入理解_虚引用_20

 

(2)复制算法:

主要用于新生代的回收,把内存划分成大小相等的两块,每次只使用其中的一块,每次把GC后存活的对象复制到另一块上,然后清理已经使用过的内存。优点是效率高和实现简单

JVM深入理解_数据_21

 

(3)标记整理算法:

主要用于老年代的回收,先标记需要回收的对象,然后将存活的对象移向一端,然后直接清理掉边界外的内存
JVM深入理解_句柄_22

分代收集算法

JVM深入理解_虚引用_23

 

11、GC垃圾回收器

JVM深入理解_java_24

 

JVM深入理解_虚引用_25

 

G1

JVM深入理解_数据_26

 

JVM深入理解_虚引用_27

 

 

12、JVM调优

1、JPS

JVM深入理解_java_28

 

JVM深入理解_软引用_29

 

JVM深入理解_数据_30

 

JVM深入理解_软引用_31

 

JVM深入理解_数据_32

 

 

2、jstat

JVM深入理解_java_33

 

JVM深入理解_数据_34

 

JVM深入理解_java_35

 

JVM深入理解_软引用_36

 

3、jstack

JVM深入理解_软引用_37

 

4、jmap

JVM深入理解_虚引用_38

 

JVM深入理解_虚引用_39

 

JVM深入理解_软引用_40

 

 

5、jconsole(总)(自带)

JVM深入理解_java_41

 

JVM深入理解_数据_42

 

 

JVM深入理解_句柄_43

 

JVM深入理解_虚引用_44

 

6、jvisualvm(需要下载)

JVM深入理解_软引用_45

 

JVM深入理解_软引用_46