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