1 . 四种算法
1.1 引用记数法(了解 实际上不会用)
、这个对象有三处引用,有人引用就加1,没有引用就减1,减到0 的时候,说明没人引用我,没用用的就是垃圾,需要被jvm 收集到
1.2 复制算法
年轻代中使用的是Minor GC,这种算法采用的就是复制算法
优点: 不会产生内存碎片
缺点: 耗空间
当我new一个对象时,他是放在了新生区的缅甸区。
。任意的堆空间是有限的,假设一直new对象。达到一定阈值以后,Eden 满了,就会触发YGC(轻GC) 。
。堆内存溢出,就开始杀,但是有些对象确实在引用的,所以就不能杀光,Eden基本杀光,活着那几个就会复制到幸存者0区from区 。
。在继续不断的new对象,第二次 Eden 又满了,只要GC,Eden必须清空。将
剩下的对象拷贝到to区。复制后有交换,上一步的from区变成to区(因为上一步的幸存者0区已经空了,变成to区),上一步的to区变成from区【谁空谁是t】
。假设杀了十几次还在幸存,说明这个对象长期使用不能回收,就会从新生区流到了养老区
。因为new的快,当新生区,养老区都满了,就会发生FGC(负GC)
FGC 多次,发现养老区空间没办法腾出来,就会发生OOM,俗称堆内存溢出
1.3 标记清除
优点:不需要额外空间
缺点:两次扫描,耗时严重。会产生内存碎片
1.3 标记压缩
比标记清除多一个整理的过程
缺点:耗时最长
2 哪个算法最好?
没有最好的算法,只要根据每一代垃圾回收的特点来选择算法
新生代: 复制算法
老年代: 标记清除,标记压缩