写在前面
在之前对于 java 进阶课程的学习中,涉及到了3章 JVM 的部分。算是对 《深入理解JVM虚拟机》的提前学习了。
不过这本书内容实在是很多,要一下子记住也不现实。在本篇中,我们先对这本书的重点内容进行划分。做到 有重点的看书,这样才能事半功倍。
CH1. 走进 Java
这一章不是重点,只需要明白两个点即可。
JDK、JRE 的区别 Java SE & Java EE 的区别
都是几句话就可以讲明白的。
Jdk 1.8 和 jdk 1.7 有什么区别,做了哪些优化。
这一部分看一下别人的博客,这个问题在对整本书有了理解之后再来看。
CH2. Java 内存区域与内存溢出异常
这一章是面试的重点。
程序计数器
指明当前运行字节码行数。
没有 OutOfMemoryError 错误。
Java虚拟机栈
明白栈是和方法对应的。
每一个方法调用对应一个栈帧。栈帧用于存储局部变量表、操作数栈、方法出口等信息。
局部变量表存放编译期可知的各种基本数据类型、对象引用、returnAddr 类型。
对应的 stackOverFlowError。可能会出现在递归调用,出口没有写好的时候。
本地方法栈
和虚拟机栈类似,明白本地方法可以是其他语言编写的。
Java 堆
对象实例和数组在堆上分配。
垃圾分代收集主要发生在堆上。
方法区
存储 类信息、常量、静态变量、编译后的代码等
方法区 和 “永久代”,一般不做区分。
jdk 1.8 中,“元空间” 的概念,使用了本地内存。可以了解一下这个概念。
运行时常量池
方法区一部分,存放编译期生成的字面量和符号引用(理解为对用一个符号来代替引用的类)。由类加载过程将这些放入方法区。
具有动态性,String 的 intern() 方法就是一个实现。
直接内存
直接内存并不是虚拟机的一部分。
对象的创建
new 一个对象时候发生了什么。
检查--内存分配(指针碰撞、空闲列表)--初始化
对象的内存布局
对象头 -- 实例数据 -- 对象填充
对象的访问定位
句柄访问 -- 直接地址访问
在第2章中,除了上面提到的,还需要关注一下,“有没有遇到过堆溢出,有没有遇到过栈溢出” 这样的问题。
CH3 垃圾收集器与内存分配策略
这一章很重要。
引用计数算法
引用一次计数加一。
循环引用,无法判断对象已死。
可达性分析算法(根搜索算法)
从 GC ROOT 节点出发,搜索引用链,对象不可被搜索到,就是垃圾。
GC ROOT 节点:
- 虚拟机栈(栈帧的本地变量表)中引用的对象
- 本地方法栈引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
再谈引用
强软弱虚4种引用。
生存还是死亡
这里主要讲 finalize() 方法会不会去救这个对象,不救的话,对象就真的死了。
就是说判断对象存活之后,其实还是可以救的,就是在 finalize() 方法中,再将该对象和当前可达对象建立引用。
不过,任何对象的 finalize() 方法只执行一次,如果遇到下一次垃圾回收,就必死。
标记-清除算法
内容:先标记,再清除
优缺点:速度快,但是容易产生内存碎片
复制算法
内容:内存分开,一次一半,存活复制
优缺点:没有碎片。但是内存只能用一半,存活对象多,效率低(复制耗时)
标记-整理算法
内容:先标记,再整理
优缺点:没有内存碎片。
分代收集算法
堆分代,新生代复制算法,老年代标记整理算法。
垃圾收集器
这里需要你多花点时间,做一下总结。面试会问,xxx的时候(特点)需要什么收集器这样的问题。
一共有7种垃圾收集器,CMS & G1 收集器是重点。

CMS收集器:初始标记--并发标记--重新标记--并发清除
G1 收集器:初始标记--并发标记--最终标记--筛选回收
内存分配与回收策略
MinorGC: 清理新生代
MajorGC: 清理老年代
FullGC: 清理整个堆空间
- 对象优先在 Eden 分配
- 大对象直接进入老年代
- 长期存活的对象进入老年代
- 动态对象年龄判定
这里是说除了直接按照年龄判定,也可以进行动态判定。 - 空间分配担保
年轻代借用老年代的空间进行担保。如果老年代不够则要 MajorGC
CH4 虚拟机性能监控与故障处理
这一章,不是重点,我们需要了解一下 4.2 小节中,关于 JDK 的命令行工具。真正操作一下。
实践一下怎么弄。
CH5 调优案例分析与实战
不是重点,但还是需要了解一下的。
最好能有一些项目里面的调优经历。
关于CH4 & CH5 的部分,看能否找到一个网课,跟着操作一下。
CH6 类文件结构
不是重点,主要了解一下6.3小节中,关于Class类文件的结构
魔数与 Class 文件的版本、常量池、访问标志、类索引&父类索引、字段表集合、方发表集合、属性表集合
这一部分不用很深入
CH7 虚拟机类加载机制
这一章是重点内容!
类加载过程
加载--验证--准备--解析--初始化
类加载器
类与类加载器
双亲委派模型
破坏双亲委派模型
Java.lang. 自己写的包能不能加载?不能。因为加载机制决定的。
CH8 虚拟机字节码执行引擎
了解一下 8.2 小节,关于运行时栈帧的结构。
CH9 类加载及执行子系统的案例
不用看
CH10 早期优化
大概可以读一下
CH11 晚期优化
大概可以读一下
CH12 Java内存模型与线程
这一章也是重点,不过很多涉及的知识都在《Java高并发》那本书里面,这里可以先看看,之后也是要看那本书的。
内存间交互操作
lock(锁定)--unlock(解锁)--load(载入)--use(使用)--assign(复制)--store(存储)--write(写入)
网友评论