垃圾回收的一点知识整理

垃圾回收算法:
标记-清理(Mark-Sweep):先标记,在清理,存在效率和空间问题
复制(copying):将空间分为Eden、from-survivor,to-survivor,每次只使用Eden和from-survivor区域,将存活下来的放入to-survivor,需要进行空间担保来应多存活数量较多的情况,适用于新生代(-XX:SurvivorRatio)
标记-整理(Mark-Compact):先标记,再将剩下的对象往一端进行移动,适用于老年代


垃圾回收器

serial:线性收集器,标记和收集线程都只有一个,并且都需要stop the world,有(new和old两个版本)
ParNew:并行收集器,新生代版本,可以与CMS一起使用,主要特点是可以使用多个GC线程
Parallel Scavenge:另外一种并行收集器,主要关注CPU的吞吐量
CMS(Concurrent Mark Sweep):一种并发收集器,用于老年代,整个GC过程总共有三个标记和一个清理(初始标记,并发标记,重新标记,并发清理),初始标记只标记与GC root直接关联的对象,并发标记就是进行完全的 GC ROOTS Tracing,重新标记就是修正在并发标记期间因用户程序而发生变动的那部分对象,最后进行并发清除
CMS的停顿时间非常短,但也有三个缺点:对cpu资源敏感、浮动垃圾会引起concurrent mode failure,主要基于标记清除算法,会造成空间碎片,需要制定整理策略
G1:将空间分为多个大小相等的独立空间(region),每次只对其中一部分进行回收,G1可以根据新生代或者老年代采用不同的算法。
-XX:PrintGCDetails


gc类型

minor gc, major gc, full gc
minor gc:新生代gc,当eden区域不足时发生
major gc/full gc,通常这两个概念是等价的,major gc通常是伴随着minor gc,当进行minor gc时,发现老年代可供晋级空间不足,则会触发一次full gc,针对整个java堆


from-survivor/to-survivor

新生对象会分配在eden区域中,当eden区域满了之后会发生minor gc,然后将eden区域和from-survivor区域中存活的对象拷入to-survivor,而to-survivor中的部分对象会晋级到老年代中,最后form-survivor和to-survivor会互换身份
阅读更多
文章标签: java 垃圾回收 jvm
个人分类: 深入浅出JVM
上一篇netty的引导过程(服务端)
下一篇spring中的后置处理器
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭