总结下自己掌握的关于JVM垃圾回收相关的知识点~
无法解决循环依赖问题
从一些roots对象出发,沿着roots对象追踪对象上的引用,能追踪到的对象都是存活的对象;没有被roots对象引用的视为垃圾对象。
可以作为GC Roots
的对象有:
标记出所有需要回收的对象,标记完成后回收被标记的对象。
有两个缺点:
内存1分为2,每次只使用其中的1半。当其中的一块空间用完了,就将还存活着的对象复制到另外一块内存空间上,然后把已使用的那一块空间一次清理掉
有2个缺点:
标记过程仍与“标记-清除”算法一样,但是后续不是直接对可回收对象进行清理。而是让存活的对象都向一端移动,最后清楚掉端边界以外的内存。
根据相关实验(?....?), 很多对象存活时间都是很短的, 少部分的对象存活时间会稍长一些,根据这些特性吧,JVM将堆化分为新生代
和老年代
:
相关参数配置:
堆的大小: -Xms4G -Xmx4G
新生代和老年代比例:默认1:2,
新生代和survior比例默认: 8:1:1
名称 | 介绍 | 采用的算法 | STW |
---|---|---|---|
Serial | 单线程收集年轻代 | 复制算法 | STW |
ParNew | 多线程收集年轻代 | 复制算法 | STW |
Parallel Scavenge | 吞吐量优先的多线程收集年轻代 | 复制算法 | STW |
名称 | 介绍 | 采用的算法 | STW |
---|---|---|---|
Serial Old | 单线程收集Old区 | 标记-整理 | STW |
Parallel Old | 多线程收集Old区 | 标记-整理 | STW |
CMS | 并发标记清除收集Old区 | 复制算法 | 和用户线程并行 |
参考这篇文章:Major GC和Full GC的区别是什么?
G1收集器不区分新生代和老年代,统一用标记整理算法收集2个分代的垃圾。
原文:https://www.cnblogs.com/yangweiqiang/p/13525862.html