jvm gc
2020-08-10 13:08:51 16 举报
jvm gc
作者其他创作
大纲/内容
并行且并发式GC
并发,并行
分代内可达性分析
并发式GC
最终标记:处理在GC过程中在内存区创建的对象的引用
GC
所有用户线程都达到安全点(区)
标记所有需要回收的对象
复制算法
并发
在经过标记阶段后执行清除,直接清除掉可回收的对象。优点: 1.实现简单快速缺点: 1.回收后内存块不连续,存在各个小块(内存片),这给对象的分配带来了难度。
根据引用链向下搜索
Y
GC结束
与Parallel Scavenge配套使用的老年代版本优点:1.能够自动调节GC策略,使用简单
分代理论
N
在经过标记阶段后将存活的对象复制到保留区域,之后清空回收前的区域。优点: 1.回收后空间连续,有利于对象的分配2.3.GC频率远小于对象分配和访问频率,因此对吞吐量影响小缺点: 1.需要为每次GC预留一个保留区域,空间利用率低; 2.复制比删除带来的代价更大,如果存活对象较多,可能GC代价大; 3.复制对象和更新引用实现复杂(当然如果阻塞式GC就很简单) 4.如果保留区域存不下所有存活的对象,则需要多余的空间来分配担保({Reference 新生代Eden,from和to的结构设计})
并发重映射:修正最新的对象地址(低优先级)
旨在保证高吞吐量的前提下使得GC停顿时间短动态Region布局,(中小型CD,大型CUD);使用指针存储数据;多重内存映射技术优点:1.一旦一个Region中所有对象死亡,能够立即被GC重用; 2.使用指针存储对象引用状态,不再需要使用写屏障和转发指针等; 3.根据策略对指定Region进行回收行为。缺点:1.仅支持X86CPU架构的系统,最大堆内存4T; 2.不能开启指针压缩; 3.结构复杂; 4.单次GC时间长,如果创建对象频繁可能GC速度比不上分配速度。
清空回收前使用的区域
并发重分配:将重分配集采用复制算法GC(修改指针重定向位,代表对象被移动过)
标记——清除
......
暂停用户线程
标记算法
Parallel Scavenge
清空另一侧的所有死亡对象
GC完成
G1
注重吞吐量的新生代GC收集器优点:1.能够自动调节GC策略,使用简单缺点:1.在当时只有Serial Old能够与之配合使用
用户线程
阻塞,并发,并行
阻塞
2.标记算法
并发清除
ZGC
GC线程
选择GC范围和收集器
决定哪些对象需要回收
选取GCRoot
Serial New
初始标记:标记与GCRoot直接关联的对象,为用户线程分配可用区
将该对象移出不可达集合
GC线程开始
直接在内存块中清除对象
阻塞式GC(stop the world)
记忆集用于在分代(局部)GC时的标记算法(现在基本都是可达性分析算法),防止需要搜索整个非GC区域来确定不可达对象。在进行分代GC时,每次非GC区域都需要维护一份记忆集来确保GC区域所有对象顺利完成可达性分析。通常记忆集有下面几种: 字长精度:即标记本区域存在对其他区域某块内存地址的引用; 对象精度:即标记本区域存在对其他区域某个对象的引用; 卡经度(卡表):将其他区域地址分为卡,如果本区域对其他区域某一地址内容存在引用,则将包含这个引用目标的卡标记为存在引用。(现在基本都是这种记忆集)卡表的设计要求程序必须要赋值器添加引用前修改卡表状态,即添加写屏障(屏障是类似AOP中的Around,需要在写前更新卡表状态)优点:1.防止在局部GC时扫描所有的非GC区域。缺点:1.需要使用写屏障,代价较高(当然低于搜索整个非GC区域)。2.存在内存伪共享问题,卡表需要在各个CPU的工作内存具有可见性,而CPU(64位)的CacheLine一般为64位,每个卡表为1字节,每个卡表元素为2^n字位,每次读取主存时都读取64位,可能会额外读取其他cache导致性能降低。
初始标记:标记与GCRoot直接关联的对象
并发标记:标记初始标记下的对象
停顿时间较短的收集器优点:1.停顿时间短缺点:1.与用户线程并行,影响吞吐量; 2.采用并发可达性分析算法,可能导致产生浮动垃圾; 3.并发标记过程中需要预留空间给用户线程,如果空间不足则会触发Full GC阻塞用户线程; 4.标记—清除降低对象分配阶段难度和效率。
标记整理算法
GC收集器
其余对象为不可达对象
觉得画的可以的看完点个赞,白嫖免费文件数量他不香吗
存在当前标记的不可达对象的引用
筛选回收:根据策略对指定Region回收 复制算法
并行式GC
将存活的对象复制到保留区与
Parallel Old
并发标记:标记初始标记下的对象(标记在指针上)
串行式GC收集器的年轻代版整个过程是阻塞式优点:1.实现简单,速度快 2.单线程GC,对于单核CPU性能很高 3.占用内存少,吞吐量高缺点:1.全程阻塞用户线程
1.GC模式
分代GC
可达性分析算法
Serial Old
重新标记:标记并发标记期间赋值器的改动对象
串行式GC收集器的并发版本整个过程是并发式优点:1.多线程GC,对于多核CPU性能比传统Serial收集器高 2.占用内存少,吞吐量高缺点:1.全程阻塞用户线程 2.在单/双核CPU下性能比Serial收集器差
标记可达对象
并发预备重分配:搜索所有Region得到重分配集
ParNew
何种策略回收对象
剩余对象为不可达对象
搜索完成
将所有存活的对象向一侧移动
在经过标记阶段后将存活的对象向一侧移动,在这之后清空另一侧的所有空间。优点: 1.回收后空间连续,有利于对象的分配 2.相比较于复制算法,没有多余的空间占用 3.GC频率远小于对象分配和访问频率,因此对吞吐量影响小缺点: 1.移动比删除带来的代价更大,如果存活对象较多,可能GC代价大; 2.移动对象和更新引用实现复杂(当然如果阻塞式GC就很简单)
CMS
3.GC算法
checkpoint
标记——整理
获得分代内不可达对象
预执行GC,安全点
标记——复制
检验记忆集
串行式GC收集器的老年代版整个过程是阻塞式优点:1.实现简单,速度快 2.单线程GC,对于单核CPU性能很高 3.占用内存少,吞吐量高缺点:1.全程阻塞用户线程
GC模式
面向局部搜集,采用Region内存布局和能够指定期望GC时间的收集器,使用记忆集来解决局部搜集下跨Region引用问题。优点:1.能够根据用户的期望选择相应的GC策略缺点:1.使用记忆集解决跨Region局部GC问题,需要额外存储空间和CPU资源; 2.结构复杂
GC算法
0 条评论
回复 删除
下一页