垃圾回收器
2021-04-15 15:09:13 0 举报
JVM常见七种垃圾回收器以及使用的垃圾回收算法总结
作者其他创作
大纲/内容
区域较大,对象生命周期长、存活率高,回收不及年轻代频繁。
CMS
并行
JDK8默认
为什么HotSpot要分代?
复制算法
将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收
Serial
清除
在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC 才会在执行垃圾回收时,释放掉其所占用的内存空间
G1
Parallel
可达性分析算法
标记-压缩算法
老年代
分代收集算法所有GC通用
为什么不用压缩?因为并发,压缩会改变资源因此缺点:产生空间碎片
Java使用
停顿时间
标记压缩算法复制算法
第一次只标记root直接相连的对象第二次标记与用户线程同时执行第三次修正第二次并发时产生的变动最后清除未标记对象
标记清除
Serial old
初始标记阶段STW并发标记阶段重新标记阶段STW并发清除阶段
串行
新生代
Java不用
维护了一个优先列表,根据允许的GC时间选择回收价值最大的Regin(Garbage-First名字由来)
第一个并发但从未成为默认JDK9抛弃
引用计数算法
标记:Collector 从引用根节点开始遍历,标记所有被引用的对象。一般是在对象的 Header 中记录为可达对象。标记的是引用的对象,不是垃圾!!清除:Collector 对堆内存从头到尾进行线性的遍历,如果发现某个对象在其Header 中没有标记为可达对象,则将其回收
这种算法并没有什么新的思想,只是根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适合的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成。而老年代中因为对象存活率高、没有额外空间对他进行分配担保,就必须使用“标记-清理”或者“标记-整理”算法来进行回收。
新生代老年代
G1 将内存划分为一个个的 Region。内存的回收是以 Region 作为基本单位的。Region 之间是复制算法,但整体上实际可看作是标记-压缩算法
区域相对老年代较小,对象生命周期短、存活率低,回收频繁Eden Survivor0 Survivor1
第一阶段和标记清除算法一样,从根节点开始标记所有被引用对象第二阶段将所有的存活对象压缩到内存的一端,按顺序排放。之后,清理边界外所有的空间。
提升GC效率
Parallel old
吞吐量
标记算法
ParNew
并发 并行
并发
0 条评论
回复 删除
下一页