持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
JVM的常量池
GC 垃圾回收
GC的区域
堆的新生代(包括Eden区和幸存者区)、老年代
GC种类
轻GC(普通GC)
重GC(全局GC)
GC算法
引用计数法
需要为每一个对象分配一个计数器,对象被引用了计数器+1,引用结束-1,计数器为0就会被回收
这种方法用的不多,消耗资源(比如分配计数器),效率不高
复制算法
这个算法主要用在新生代
每次GC都会将Eden中活的对象转移到幸存区中,一旦Eden区进行GC后,Eden区中的所有内容都会被清空,没有被回收掉的对象则进入幸存区。
幸存区又分为to区和from区,在GC时用来进行交换(对from区中对象进行GC,存活的对象进入to区,此时from区空则变为to区),谁空谁是to区,默认经过15次GC
依然有对象存活,则将存活的对象转移到老年代。复制算法的复制就在于将Eden区中的对象复制到幸存区、将from区中存活的对象复制到to区。参数-XX:MaxTenuringThreshold可以修改默认的15
,即从新生代到老年代经历的GC次数。
GC过程:
-
Eden区和from区的活下来的对象则进入to区,Eden区和原from区变空,原from区变为to区,原to区变为from区(交换),对象转移是通过复制进行的。
-
经过15次之后则进入老年代
好处:
- 没有碎片空间
坏处:
- 浪费空间,幸存区多了一半空间永远是空 to
较好的使用场景:对象的存活度较低
标记、清除、压缩
标记:扫描对象,进行标记。
清除:对没有标记的对象进行清除。
压缩:防止内存碎片产生,向一端移动存活的对象,是对象集中在一端。
标记清除压缩
先标记清除几次,再进行压缩
好处:不适用额外空间
缺点:需要扫描标记对象,浪费时间
总结
内存效率(时间):复制算法(一次扫描对象) > 标记清除算法(两次扫描对象:标记、清除) > 标记压缩算法(标记、清除、压缩)
内存整齐度:复制算法 = 标记压缩算法 > 标记清除算法
内存利用率:标记压缩算法 = 标记清除算法 > 复制算法