最近又重新温习了一遍《深入理解Java虚拟机:JVM高级特性与最佳实践》,我发现这本书每过一段时间,重新拾起来再读一遍的话,自己对书中的内容会理解的更加深刻。今天在这里做个小总结吧。

Java高级进阶必须要读的一本书之一,知识点多而深,部分点需要有实践经验才能消化。大概复盘自己关于本书消化的知识点,一方面加深印象,一方面便于回顾。

上述图片大致将本书的重点章节内容归纳总结一下。

1.Java虚拟机是什么?

Java虚拟机连接Java语言和各种平台操作系统的中间件,通过Java虚拟机就可以将由Java语言开发的应用程序编译为适合操作系统识别的机器码,即将class文件通过对应平台的JVM解释成平台识别的机器码,是实现Java跨平台的关键技术。

主要作用

A:将class文件编译为操作系统可以识别的机器码(后编译阶段)

B:自动化内存管理。

2.Java虚拟机的工作原理?

2.1.内存区域管理

2.1.1. 内存区域划分

i.堆

1.对象的主要存储地点

2.所有线程共享

ii.方法区

1.Class对象相关信息,类变量

2.所有线程共享

iii.本地方法区

iv.栈

1.主要存储局部变量,对象的引用

v.程序计数器:不会发生out of memory

2.1.2. 垃圾回收机机制

i.主要针对的是堆区域

ii.通过可达性分析来判断一个对象是否可以被回收。可以作为根对象的有:虚拟机栈中引用的对象,方法区中静态类属性引用的对象,方法区中常量引用的对象,本地方法区中引用的对象

iii.垃圾收集算法

1.标记清除

2.标记复制

3.标记整理

4.分代算法

iv.垃圾收集器

1.是否和应用进程并行

a)平行:G1, CMS, Parallel Old

b)串行:Serial,serial Old ParNew;

2.应用的分代

a)年轻代:serial, parNew,Parallel Scavenge, G1

b)老年代: CMS, SerialOld, G1,Parallel Old

3.最常用的G1和CMS

a)G1:追求低停顿,

i. 特点:并行和并发,分代回收,空间整合,可以预测停顿,

ii. 大致流程:初始标记,并发标记,最终标记,筛选回收

b)CMS:追求低停顿

i. 特点:并行并发收集垃圾,无法清除浮动垃圾,会产生内存碎片

ii. 大致流程:初始标记,并发标记,重新标记,并发清除

2.2.编译Java文件

将java文件编译成操作系统识别的机器码大致需要经历两个阶段,前编译阶段将java文件编译成class文件,后编译阶段将class文件编译成操作系统的识别的字节码;这里JVM主要作用于后编译阶段。

2.2.1. 虚拟机类加载机制

i.加载流程:加载,链接(验证,准备,解析),初始化

ii.双亲委派模型:防止基础类误加载成用户自定义的类

iii.类加载器的种类:启动类加载器,扩展类加载器,应用类加载器,用户自定义类加载器

2.2.2. 虚拟机编译class文件

i.Java虚拟机既可以解释执行也可以编译执行;想要立即执行的代码采用解释执行,对热点代码采用编译执行以提高执行效率

3.如何灵活使用Java虚拟机?

3.1. 充分利用资源层面

i.Java的内存模型:线程 + 线程本地内存 + 主存;所有的变量都存储在主存中,而线程的工作内存中保存的是主存变量的copy,线程对变量的操作都必须在工作内存中进行,线程之间变量值的传递必须通过主存进行。

ii.多线程环境下的线程安全

  1. 可见性,原子性,指令重排序:volatile 保证可见性和禁止指令重排序

  2. 同步策略:互斥同步(各种锁,sychronized,lock),非阻塞同步(cas)

  3. 锁优化层面:自旋锁(方式线程不断在内核和用户态切换带来的开销),锁粗化,偏向锁,锁消除等

3.2. 问题分析层面

i. 通过相关JVM提供的相关命令:JPS,Jstat,Jstack,jhat, jmap