美文网首页
《深入理解JVM虚拟机》重点内容

《深入理解JVM虚拟机》重点内容

作者: MikeShine | 来源:发表于2020-02-10 10:57 被阅读0次

写在前面

在之前对于 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 收集器是重点。


7种垃圾收集器

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(写入)


CH13 线程安全与锁优化

相关文章

网友评论

      本文标题:《深入理解JVM虚拟机》重点内容

      本文链接:https://www.haomeiwen.com/subject/nefaxhtx.html