JVM,之前觉得是不可触及的东西,怎么也得高级Java程序员才能接触吧,我等鼠辈不感动不感动。然后后面毕业时找工作发现都要求应届生熟悉JVM……额…其实可以试试。

一、JVM架构图

image-20220619084242903

好大一个图

二、类加载

首先得知道什么是类加载?

类加载就是将类信息经过一系列处理放到内存,供实例化使用。

1、加载

JVM提供了不同类型的类加载器,采用双亲委派机制。不同类加载器的加载路径不同。

image-20220619090127403

双亲委派的好处:1、反正类的重复加载。2、防止核心API被恶意篡改。

2、链接

链接阶段有三个子步骤:

image-20220619090902387

验证:确保class文件的字节流信息符合JVM的规范。

准备:为类中的静态变量分配内存空间。

解析:将常量池中的符号引用转换为直接引用。

ps:符号引用(以符号来描述引用的目标),直接引用(直接指向目标的指针)

3、初始化

简言之,为类的静态变量赋予正确的初始值

三、运行时数据区

1、组成部分

就用之前画的思维导图大致描述吧

image-20220619094258496

2、如何判断对象是否要被回收?

可达性分析算法

以根对象集合(GCRoots)为起始点,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达,不可达的则会被下次gc回收

image-20220619094744928

引用记数法

对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加一;当引用失效时,计数器的值就减一。当某一时刻计数器的值为零时,这个对象就不再被使用。

ps:存在循环依赖的问题。

3、垃圾回收算法

  • 复制算法(新生代)
  • 分代算法
  • 标记清除(老年代)
  • 标记整理(老年代)

这老哥讲得很清楚,就不做复印机了

4、GC收集器

对于我们做服务器开发,要深入理解CMS和G1这两个:

image-20220619100016364

未完待续…