JVM内存模型
2021-04-07 16:50:21 34 举报
自己的理解
作者其他创作
大纲/内容
C
B
E
实际结果
解析
D
方法区(元空间)常量、静态变量、类元信息
当CMS出现\"concurrentmode failure\",此时会进入stop the world,用serial old垃圾收集器来回收
A
单线程收集时STW复制算法
GC Root
验证
本地方法栈
程序计数器
在并发标记过程中,如果由于方法运行结束导致部分局部变量(gcroot)被销毁,这个gcroot引用的对象之前又被扫描过(被标记为非垃圾对象),那么本轮GC不会回收这部分内存。这部分本应该回收但是没有回收到的内存,被称之为“浮动垃圾”。浮动垃圾并不会影响垃圾回收的正确性,只是需要等到下一轮垃圾回收中才被清除。另外,针对并发标记(还有并发清理)开始后产生的新对象,通常的做法是直接全部当成黑色,本轮不会进行清除。这部分对象期间可能也会变为垃圾,这也算是浮动垃圾的一部分。
颜色含义
垃圾回收器
FILO (栈)
初始化
准备
Minor GC
线程1
原始快照
函数2 - 栈帧
栈帧
开始没有后面新增
多线程收集时STW复制算法
开始引用后面去除
多标-浮动垃圾
增量更新: 就是当黑色对象插入新的指向白色对象的引用关系时, 就将这个新插入的引用记录下来, 等并发扫描结束之后, 再将这些记录过的引用关系中的黑色对象为根, 重新扫描一次。 这可以简化理解为,黑色对象一旦新插入了指向白色对象的引用之后, 它就变回灰色对象了。 原始快照: 就是当灰色对象要删除指向font color=\"#ff3333\
漏标-读写屏障
复制算法
公共访问
原始快照方式
survivor0
类装载子系统
G1
方法区回收
survivor1
函数1 - 栈帧
扩展类加载器
Serial
触发时机span style=\"font-size: inherit;\
ParNew
通过URLClassLoader#addURL加入
外部Jar包
垃圾回收
CMS:增量更新的写屏障 G1,Shenandoah:SATB的写屏障ZGC:读屏障
Parallel Old
字节码执行引擎
YoungGC YoungGC并不是说现有的Eden区放满了就会马上触发,G1会计算下现在Eden区回收大概要多久时间,如果回收时间远远小于参数 -XX:MaxGCPauseMills 设定的值,那么增加年轻代的region,继续给新对象存放,不会马上做YoungGC,直到下一次Eden区放满,G1计算回收时间接近参数 -XX:MaxGCPauseMills 设定的值,那么就会触发Young GCMixedGC 不是FullGC,老年代的堆占有率达到参数(-XX:InitiatingHeapOccupancyPercent)设定的值则触发,回收所有的Young和部分Old(根据期望的GC停顿时间确定old区垃圾收集的优先顺序)以及大对象区,正常情况G1的垃圾收集是先做MixedGC,主要使用复制算法,需要把各个region中存活的对象拷贝到别的region里去,拷贝过程中如果发现没有足够的空region能够承载拷贝对象就会触发一次Full GCFull GC 停止系统程序,然后采用单线程进行标记、清理和压缩整理,好空闲出来一批Region来供下一次MixedGC使用,这个过程是非常耗时的。(Shenandoah优化成多线程收集了)
函数0 - 栈帧
自定义类加载器(不一定存在)
漏标必须要同时满足以下两个条件: 1. 赋值器插入了一条或者多条从黑色对象到白色对象的新引用; 2. 赋值器删除了全部从灰色对象到该白色对象的直接或间接引用。
defineClass
内存模型
并发标记阶段
Full GC
并发标记并发清理
年轻代
标记清除算法
ClassLoader
删除
开始
黑色: 表示对象已经被垃圾收集器访问过, 且这个对象的所有引用都已经扫描过。 黑色的对象代表已经扫描过, 它是安全存活的, 如果有其他对象引用指向了黑色对象, 无须重新扫描一遍。 黑色对象不可能直接(不经过灰色对象) 指向某个白色对象。灰色: 表示对象已经被垃圾收集器访问过, 但这个对象上至少存在一个引用还没有被扫描过。白色: 表示对象尚未被垃圾收集器访问过。 显然在可达性分析刚刚开始的阶段, 所有的对象都是白色的, 若在分析结束的阶段, 仍然是白色的对象, 即代表不可达
装载
Eden
引导类加载器
应用程序类加载器
卸载
CMS
相关链接
使用
标记整理算法
空间分配担保机制链接
单线程收集时STW标记-整理算法
加载
Parallel
并发某些阶段STW标记-清除算法
并发产生的问题
Serial Old
重新标记阶段
回收算法
JVM虚拟机
线程私有
老年代
loadClass
.class文件
多线程收集时STW标记-整理算法
堆
findClass
线程2
并发标记阶段会使用三色标记算法
收藏
0 条评论
下一页