JVM逻辑
2023-01-10 22:48:22 10 举报
AI智能生成
Jvm
作者其他创作
大纲/内容
类加载机制
双亲委派机制
加载某个类时,会先委托父加载器寻找目标类,如果没有找到,会再往上寻求上级加载类寻找,如果所有父加载类都找不到目标类,这时才会在自己的类加载路径中寻找并载入目标类
为什么会设计双亲委派机制
沙箱安全机制:防止JDK核心类库API被恶意篡改
避免类的重复加载
引导类加载器
扩展类加载器
应用程序加载器
自定义类加载器
重写findClass方法
loadClass方法实现了双亲委派机制
整体结构分析
类加载子系统
执行引擎
内存模型
堆
Eden区
幸存一区
幸存二区
老年代
栈
局部变量表
操作数栈
动态连接
方法出口
本地方法栈
主要是以C/C++语言实现的底层方法
元空间
常量
静态变量
类信息
程序计数器
内存分配机制
对象创建流程
类加载检查
分配内存空间
指针碰撞
空闲列表
初始化
设置对象头
哈希码
GC分代年龄
锁信息
元数据指针
为什么要进行指针压缩?
在64位平台的HotSpot中使用32位指针,内存使用会多出1.5倍左右,使用较大指针在主内存和缓存之间移动数据,占用较大宽带,同时GC也会承受较大压力
为了减少64位平台下内存的消耗,启用指针压缩功能
在jvm中,32位地址最大支持4G内存(2的32次方),可以通过对对象指针的压缩编码、解码方式进行优化,使得jvm 只用32位地址就可以支持更大的内存配置(小于等于32G)
init(属性赋值)
对象内存分配
入栈
逃逸分析
标量替换
进入Eden区
当Eden没有足够的空间时会触发一次MinorGC
Eden与Survivor的比例默认为8:1:1
进入老年代
大对象直接进入老年代
分代年龄达到进入老年代,每次Minior都会使年龄+1
对象动态年龄判断
当幸存者区域所有分带年龄大于0的对象总和超过了幸存区区域的百分之五十,这时会将这部分对象放到老年代中
老年代分配担保机制
在做minorGC之前会计算老年代剩余空间 是否大于年轻代所有对象总和,如果不是就会触发FULLGC
对象内存回收
可达性算法
根据静态变量,本地方法栈,线程栈本地变量等等作为GC Roots来搜索引用的对象,这部分对象标记为非垃圾对象
垃圾收集器
串行收集器(Serial收集器)
单线程的收集器,年轻代采用标记复制、老年代采用标记整理的算法,全程STW
并行收集器(Parallel Scavenge)
Serial收集器的多线程版本,可以根据-XX修改线程数量,非必要不修改,年轻代用的是标记复制算法,老年代用的是标记整理算法,收集全程STW
ParNew收集器
l逻辑与并行的Parallel收集器一样,区别在于可以和CMS配合使用,ParNew作用于年轻代,Parallel可以作用于年轻代与老年代
CMS收集器
初始标记
标记GCRoots元对象直接能引用的对象,短时间STW
并发标记
根据GCRoots所引用的对象,遍历整个对象图,整个过程时长较长,但是不会STW
重新标记
这个步骤是为了修复并发标记中,所产生变化的对象,主要是用的三色算法,会STW
并发清理
与用户线程同步进行,如果有新增的对象会被标记为黑色。采用的是标记清理算法
问题
无法处理浮动垃圾,只能留在下一次GC进行回收
会和服务抢占资源,对CPU资源比较敏感
利用的是标记清理算法,会有垃圾碎片,但是可以配置几次GC后执行一次标记整理
在这次fullGC没执行完成的清空下,又开始了下一次GC,这时CMS会转变为Serial收集器进行回收,全程STW单线程收集。
G1收集器
ZGC收集器
垃圾收集算法
标记清理
标记非垃圾对象,其余的全部回收,会产生大量空间碎片
标记整理
和标记清理前期算法一致,但是标记完成后不会直接清理,而是将存活对象已到一端移动,完成后将未移动的直接清理
标记复制
将内存分为两部分,其中一部分使用完成后,将存活的对象复制到空闲的一部分,另外一部分之前清理
JVM调优工具
0 条评论
下一页