GC是影响JVM性能的重要因素,不同jvm厂商、版本实现了不同垃圾收集器和算法,各有优缺点。本文就jvm内存划分做进一步补充说明并聊聊各种常见的垃圾收集器,它们的基本算法和使用场景以及一些GC调优的方法。

GC的基本原理与概念

结合jvm内存划分我们知道GC通常是运行在堆内存上的,有时方法区也会运行GC。要进行垃圾回收,我们首先要知道哪些对象可以被回收,这里主要有引用计数法可达性分析两种方法标记对象是否需要回收。

对于方法区的GC复杂一点,首先Bootstrap Classloader加载的类通常是不会被回收的,其他普通加载器加载的类的回收要求加载该类的加载器被回收了才能进行,对于大量使用动态类型的应用要注意方法区内存避免方法区OOM。

具体清理对象的时候通常有三种算法,复制、标记清除、标记整理:

常见垃圾收集过程

垃圾收集过程

垃圾收集过程

上面算法不是单独运行在虚拟机上的,通常他们都会配合使用。对于垃圾收集通常会将内存分为Eden,Survivor,Tenured区如上图所示。通常新生代(New Generation)指Eden和Survivor,老年代(Old Generation)指Tenured。

常见的垃圾收集器