java垃圾回收学习笔记二
栈,局部变量。
堆,new出来的对象。
随着内存越来越大,出现了越来越多的垃圾回收器
serial
单线程
parallel
多线程
也不是线程越多越好,多了cpu调度浪费资源
serial单线程,parallel多线程。CMS为并发,但他不是任何版本的jvm的默认选项,他是一款
承上启下的垃圾回收器。
CMS(主要是讲这个)
最重要的是:并发(垃圾回收线程与工作线程一起进行。边干活,边清理)
如果在并发的时候,突然有:
1)不是垃圾的又是垃圾了(没有被标记,但又被标记成垃圾,可以按照不是垃圾处理)
2)标记成垃圾的突然又不是垃圾了:解决方案为
cms:采用3色标记
G1:采用3色标记
ZGC:颜色指针
3色标记
三色标记算法
后果为:D变成垃圾(浮动垃圾,找不到的垃圾,无所谓,下次干掉)
错标,D突然有用(刚刚被A引用了),但D不会别标记了(A为黑色,因为标记与线程同时运行,站在垃圾回收器角度讲,不会找它的引用了,就不会有机会标记D了,D就会被当成垃圾了)
现在我们解决这个方案。
cms解决方案:Increamental Update
跟踪每一次引用的变动,如果发现A引用D后,将A变成灰色,那么下次我们就会
重新扫描A的孩子们(写屏障)
bug:
所以cms的重新标记阶段,必须从头到尾扫一遍。
cms还有一个bug
当cms满了,所有的线程都停止,让serial old去清除(ms是标记清除的意思,会产生很多碎片,
满了,会让serial一个人去压缩清除),可能会清除几天。
G1的解决方案
当B指向D消失的时候会做一个记录。