Java GC小结

JVM Generations

Java的堆被划分成不同的区域:

其中,yound generation 又被划分成Eden space, Survivor Space1, Survivor Space2,其中Eden Space占了绝大部分的空间。当Eden space满的时候,GC 会将存活对象移动到其中一个Survivor Space中,两个Survivor Space是为了避免内存碎片,每次将存活的对象(Eden Space以及上一个Survivor Space)移动到另一个Survivor Space中。

通过Java VisualVM和VisualGC插件可以很直观的看到GC的过程: Visual GC

java -Xmx50m \
-XX:-PrintGC \
-XX:+PrintHeapAtGC \
-XX:MaxTenuringThreshold=10 \
-XX:+UseConcMarkSweepGC \
-XX:+UseParNewGC TestGC

Garbage Collectors

其中存在并行(Parallel)和并发(Concurrent)的区别,并行是指垃圾收集器多个线程同时工作,但此时用户线程依然是停止等待的;而并发是指在用户线程工作的同时,垃圾收集器同时执行。

GC过程

CMS

CMS 收集器的步骤:

G1将Heap划分成一些相同大小的区块,但是没有限制不同代的大小。

References: