JVM
2025-05-19 23:43:23 6 举报
AI智能生成
JVM
作者其他创作
大纲/内容
类加载机制
装载
类加载器(根据层级先后加载,存在重复类时以已有加载的为准)
Bootstrap
加载$JAVA_HOME中jire/lib/rt.jar中所有的class或Xbootclassapth选项知道的jiar包
Extension
加载java平台中扩展功能的一些jira包,包括$JAVA_HOME中jire/lib/*.jar或-Djava.ext.dirs指定目录下的jira包
Application
加载classpath中指定jar包及Djava.class.path所指定的目录下的类和jar包
通常用于业务代码加载和依赖包的加载,分别位于classes和lib文件下,通常classes会优先于lib加载,可以借助这个加载顺序,在业务文件中实现对依赖包中文件的修改
Custom
通过java.lang.ClassLoader的子类自定义加载class,属于应用程序根据自身需要自定义的ClassLoader,如tomcat,jboss都会根据J2ee规范自行实现ClassLoader
如何打破双亲委派机制
重写loadClass
SPI
OSGI
链接
验证
确保加载类符合规范
准备
为类或接口的静态字段赋默认值
赋值为默认值是为了分配空间吗?
解析
动态的将运行时常量池中的符号引用转变为直接引用
常量池和运行时常量池时相同的东西,只是一个加载在磁盘中,一个加载在内存中
符号引用和直接引用:符号引用就是关于类、方法、字段等内容的描述,无法被直接执行,直接引用则是指向这些内容的内存地址/物理地址
初始化
运行时数据区
进程生命周期
方法区
类的元数据信息和模板信息
<= java7 perm space 使用java内存
>= java8 metaspace 使用系统内存
堆
对象内存占用
对象头
Mark Word
一系列的标记位((哈希码、分代年龄、锁状态标志等)8字节
Class Pointer
指向对象对应类元数据的内存地址(堆指向方法区)8字节
Length
数组对象持有,代表数据长度
实例数据
boolean、byte 1字节
short、char 2字节
int、float 4字节
long、double 8字节
reference 8字节
short、char 2字节
int、float 4字节
long、double 8字节
reference 8字节
对齐填充
保证对象大小为8字节的整数倍
线程生命周期
虚拟机栈
PC Register
用于记录当前方法的执行节点
本地方法栈
GC
堆内存分布
old
什么情况下进入老年代
大对象,eden区无法分配空间
在s区年龄达到的长期存活对象
young
eden
对象优先分配在这里
s0
s1
s0和s1时轮训使用的一个空间,另外一个会被限制,当youngGc触发时,非垃圾对象会进入这里/从另外一个s区被复制进来,发生移动时年龄+1,当s区存不下时会向old区进行空间担保
空间担保的流程
old中最大的可用连续空间是否大于新生代所有对象空间
大于,发起发起Minor GC
小于,检查HandlePromotionFailure是否设置
没,进行Full GC
有,检查老年代的最大可用连续空间是否大于l历次晋升到老年代的对象平均大小
大于,进行Minor GC,看看GC后S区是否足够存储存活对象
不够,放入老年代,老年代也放不下,直接OOM
够,存放在S区
小于,Full GC
垃圾对象确认
引用计数
存在循环引用的垃圾对象无法被回收
可达性分析
GC Root直接或间接可访问就不会被回收
垃圾回收算法
标记-清除
遍历整个堆空间,耗时高,且会空间碎片化
标记-整理
比清除更麻烦,耗时更高
标记-复制
浪费空间
垃圾收集器
具体实现
Serial
单线程,STW,适用于单核,新老皆可用
Parallel
Serial的多线程版本
CMS
标记清除,空间碎片问题,适用老年代,STW时间低,通常配合ParallelNew一起使用
G1
解决了空间碎片问题,切STW时间更低,适用新老
ZGC
STW最小,但牺牲吞吐
分类
串行
Serial
并行
Parallel
并发
CMS、G1、ZGC

收藏
0 条评论
下一页