JVM--分代垃圾回收机制

新生代的区域分布

JVM--分代垃圾回收机制新生代的分布图如上

新生代垃圾回收机制

当伊甸园的内存不足时,如果此时再放入新的对象,则发现内存不够,会导致新生代发生一次垃圾回收,(此时进行的垃圾回收我们记为Minor GC) 此时执行的垃圾回收算法为复制算法。会将GC Root上的对象存入到幸存区(To),同时会将对象的寿命加1,由于采用的是复制算法,因此会将幸存区(To)与幸存区(From)交换地址。 若在此之后进行第二次的垃圾回收,在检查伊甸园的对象的同时,垃圾回收也会检查幸存区内的对象,然后与第一次所采用的机制相同,若幸存区的对象仍然存活,则寿命再次加一,若不存活,则会导致被垃圾回收,不管寿命为多少

老年代的垃圾回收机制

老年代相对于新年代来说,其比较简单。我们可以将老年代设想为我们想扔掉一些垃圾,但是每次我们都想在下一次把它扔掉。新生代的垃圾就像我们日常产生的垃圾,如每次吃饭后的饭盒,喝过的饮料瓶。老年代的垃圾就是新生代中产生的那些不舍得扔掉的垃圾,如家里坏掉的电脑,板凳等,只有当家里实在放不下的时候,我们才会考虑扔掉它们。 老年代的垃圾是那些新生代中的幸存区寿命大于一定阈值的对象,我们会将其从新生代转移到老年代。

要点总结

对象首先分配到伊甸园区 新生代空间不足时,触发minor gc(采用的是垃圾回收的复制算法,存活的对象年龄加一,并且交换from to) minor gc会引发一次 stop the world(会暂停其他用户的线程,只运行垃圾回收线程。因为垃圾回收牵扯到了地址的复制,若其他线程仍然在运行,会造成混乱,垃圾回收结束,用户线程才恢复运行) 当对象寿命超过阈值时,会晋升到老年代,最大寿命为15(4bit 转换为10进制为15)(不同的垃圾回收器最大寿命不同) 当老年代空间不足时,会先执行minor gc,若之后空间仍然不足,会触发full gc,STW时间更差(采用的是标记清除算法 或者标记整理算法)若full gc之后老年代的空间仍然不足,则会发生OutOfMemoryError