Java自动垃圾回收(Automatic Garbage Collection)是自动回收堆上不再使用的内存,new的对象在程序中没有引用指向它,就会被回收。回收的实现很多,有Reference Counting Collector/Tracing Collector/Compacting Collector/Coping Collector/Generational Collector/Adaptive Collector。本文记录的是HotSpot Java VM采用的Generational Collector(分代收集器)。
为什么分代?
下图是随着时间的推移,经历垃圾回收后存活下的数据大小情况。可以看出大部分对象存活期很短,随着时间的推移越来越少的对象存活下来。因此,可以针对不同的堆内存采取不同的回收频率和方法,以提高JVM性能。
堆内存分代概念
下图是Generation GC对内存结构的划分:
Eden:用于new对象时分配的内存空间,大部分初始new的对象位于该空间
Survivor Space:在eden中经历垃圾回收后,存活下来的对象被存储在该空间
tenured Space:在survivor space中存在了一段时间的对象会被挪到该空间
Permanent Space:JVM使用的元数据,如classlo