JVM知识架构
2022-08-26 18:03:09 5 举报
AI智能生成
jvm主体知识架构
作者其他创作
大纲/内容
类加载
类加载过程
加载
连接
验证
文件格式验证
元数据验证
字节码验证
符号引用验证
准备
静态变量分配内存,并设置默认初始值
常量会直接设置为指定值
解析
初始化
类加载时机
创建
访问静态变量(常量没用哈)
调用类的静态方法
反射调用
初始化子类,先初始化父类(jvm最先加载的就是,所有类的父类 object)
jvm启动入口类
类加载器
根类加载器(bootstrap class loader)
其他类加载器
扩展类加载器(extensions class loader)
系统类加载器(system class loader)
用户类加载器
双亲委派
规则
子类加载器加载之前,有限询问父级类加载器是否加载过,父类未加载过在进行加载
自定义类加载器
重新findClass方法
解决的问题
类重复加载
避免java的核心API被篡改
双亲委派模型破坏
双亲委派模型是在JDK1.2之后才被引入的
SPI机制。JNDI服务,如jdbc。需要使用子类加载器
ogsi
对象
对象内存布局
对象头
mark word
类型指针
数组长度
实例数据
对其填充
对象创建
执行类加载过程
分配内存
分配方式
指针碰撞
空闲列表
并发问题
CAS分配-失败重试
TLAB分配
初始化
设置对象头
执行init方法,设置初始值
字节码执行引擎
方法
非虚方法
静态方法
私有方法
实例构造器
父类方法
虚方法
分派
静态分派
动态分派
宗量
单分派
多分派
java语言为静态多宗量。动态单宗量的编程语言
编译与优化
前端编译
初始化插入示注解处理器
解析与符号填充
生成语法树
注解处理器,进入
字节码生成
标注检查
数据控制流分析
解语法糖
字节码生成
后端编译
解释执行
编译执行
即时编译
提前编译
及时编译触发条件
热点代码
主要优化技术
方法内联
冗余存储消除
复写传播代码
无用代码消除
逃逸分析
标量替换
栈上分配
锁消除
公共子表达式消除
数组边界检查消除
内存模型JMM
线程隔离区域
程序计数器
虚拟机栈
栈帧
局部变量表
变量槽(Variable Slot)
动态链接
操作数栈
方法返回地址
本地方法栈
公共区域
方法区
jdk8以后定义为元数据区-进入本地内存空间
类型信息
静态变量
即时编译后的代码
运行时常量池
字符串常量池-jdk8以后挪入堆中
堆
传统GC
新生代
eden
survivor
老年代
G1+
拆分成N块 region
直接内存
GC
垃圾收集器
传统垃圾回收器
Serial
ParNew
Parallel Scavenge
Parallel Old
CMS
回收过程
初始标记
并发标记
最终标记
并发清理
缺点
内存碎片
CPU占用
新兴垃圾收集器
G1
开创性设计
将内存划分为多个独立区域
按区域回收性价比,选择性回收
以区域为单位部分回收
老年代年轻代,不再是固定区域。变成一些列(不需要连续的)动态集合
概念
分区Region
示例
相关参数
-XX:G1NewSizePercent
-XX:G1MaxNewSizePercent
-XX:G1HeapRegionSize
卡Card
暂停期望
参数
-XX:MaxGCPauseMillis
建议
不要使用-XX:NewRatio、-Xmn指定年轻带大小
巨型对象
记忆集 Remember Set (RSet)
粒度
细粒度PRT
稀疏PRT
粗粒度PR
相关参数
XX:G1RSetUpdatingPauseTimePercent
-XX:ParallelGCThreads=n
打印记忆集粗化的情况
CSet 收集集合
特征
每次GC暂停时回收的一系列目标分区
G1根据收集集合,对区域进行清理,复制存回对象到空白区域、然后清空旧的区域
混合收集和,年轻带收集,都是一样的流程
老年代分区的准入标准
可以通过活跃度阈值-XX:G1MixedGCLiveThresholdPercent(默认85%)进行设置
CSet中区域对堆的总大小占比-XX:G1OldCSetRegionThresholdPercent(默认10%)设置数量上限
栅栏
写前栅栏 Pre-Write Barrrier
写后栅栏 Post-Write Barrrier
原始快照(暂不记录原始快照+三色标记的内容)
回收过程
大概过程
程序启动G1选择一个分区作为Eden
Eden满了之后,就在申请一个
Eden满了之后,就在申请一个
Eden达到上限后发起一次YoungGC
Young GC
发起暂停,等待用户线程跑到安全点以及安全区域
刷新RSet-从队列》内存
将老年代对新生代的引用,加入根节点
遍历对象图
复制存活对象到Survivor
- Survivor中对象年龄超过--XX:MaxTenuringThreshold(最大任期-默认15)之后对象进入老年代
Survivor 比例。--XX:TargetSurvivorRatio 缺省50%
更新对象引用
释放Eden空间
随着老年代空间剩余比例(相对整堆)降低,开始触发并发标记
并发标记Concurrent Marking
初始标记
根区域扫描
并发标记
重新标记|更正标记|备注
清除
参数
--XX:InitiatingHeapOccupancyPercent
混合收集MixedGC
参数
-XX:G1MixedGCCountTarget=8
-XX:G1HeapWastePercent=5
-XX:G1OldCSetRegionThresholdPercent=10
-XX:G1ReservePercent=10
-XX:G1MixedGCLiveThresholdPercent=85
回收过程
根据参数选择出,要加入CSet的老年代集合
扫描对应的RSet,将CSet中的老年代区域的RSet指向的对象加入根区域
。。。。
释放RSet
复制存活对象||对象晋升|无法为大对象提供足够的连续空间
申请扩展堆大小
扩展失败-触发FullGC
缺点
区块的卡表额外占用内存
CPU敏感
回收速度可能跟不上,垃圾生产速度。会触发FULLGC
ZGC
垃圾回收算法
判定生死
可达性分析
引用计数器
回收算法
标记整理
标记复制
标记清除
内存分配策略
分配过程
优先年轻代分配
年轻代空间不足,触发minorGc
依然不足,尝试扩展空间
minorGc发现Endn空间存活对象超过Survivor区域大小,触发分配担保提前进入老年代
晋升方式
大对象直接进入老年代
长期存活对象进入老年代
动态年龄判定
空间分配担保
minorGc之前检查老年带空间是否充足
不充足的话,判断JVM是否开启冒险
fullgc
jdk
fullGc
jvm分析命令
jinfo
+-jvm参数
打印jvm参数
jps
显示当前所有java进程
jstat
jstat-class
jstat -compiler
jstat -gc
jstat -gcutil
jmap
jmap -heap
jmap -histo[:live]
jmap -clstats
加载数量
父加载器
大小
等
jmap -finalizerinfo
jmap -dump:<dump-options>
jconsole
windows上的监控工具,不写了
jstack
javap
0 条评论
下一页
为你推荐
查看更多