java的垃圾回收分为
三个区域:新生代 老年代 永久代,如下图
一个对象实例化时会看看新生代里的Eden(伊甸园)里面有没有足够的空间
如果有,就不进行垃圾回收,对象直接储存在Eden(伊甸园)里
如果没有就会进行一次minor gc(从新生代空间(包括 Eden 和 Survivor 区域)回收内存)
然后再判断Eden(伊甸园)的内存是否足够
如果不足,就看 Survivor (存活区)的内存是否足够
如果内存足够,把Eden(伊甸园)部分活跃对象保存在存活区,然后再把对象保存在Eden(伊甸园)
如果内存不足够,就像老年代发送请求,查看老年代的内存是否足够
如果足够就将部分存活区的活跃对象存在Tenured(老年代),然后再把Eden(伊甸园)部分活跃对象保存在存活区,最后再把对象保存在Eden(伊甸园)
如果内存不够,就会进行一次full gc(是清理整个堆空间—包括年轻代和老年代),然后再次对Tenured(老年代)内存进行判断,
如果足够就进行上面的步骤,如果还不足就会抛出OutOfMemoryError
GC虽然可以进行内存空间的释放,但同时频繁的GC一定会影响性能,GC发生的频率越低,你的系统就越高效.