jvm垃圾收集策略

 垃圾回收对象主要针对是年轻代和老年代,老年代的内存空间比年轻代的内存空间大,所以我们应该避免进行老年代的内存空间的垃圾回收。

1.年轻代GC回收的策略

    算法思想:复制

    实现过程:从根集合出发,扫描出存活的对象,并且把存活对象复制到一块新的内存空间。

    算法的优化:因为Eden会产生大量的对象,为了加快内存的分配速度,实行Bump-The-Pointer技术,每一次记住最后一个保存的对象,这样就能够计算出Eden空间。因为堆的内存空间是线程共享的,所以会产生线程问题,这样的话,我们就把Eden分割为多个数据区。

    串行GC:  适用于单cpu,过程就是,扫描出存活对象,经过MinorGC后,将存活对象复制到存活区1和存活区2,经过几次MinorGc后,将对象放到老年代。但是STW(线程暂停)时间比较长      

    并行回收GC:  适用于多cpu,扫描和复制使用多线程进行的,适用于暂停时间比较短的应用。

    并行GC:  适用于多cpu,它要求和老年代的并发GC已经使用。

2. 老年代的GC回收的策略

      算法思想:标记-清除

      实现过程:从根集合出发,对存活的对象进行标记,标记完成后,对没有进行标记对象进行回收。

      算法的优化:标记-清除,容易产生内存碎片,所以使用标记-清除-压缩,把标记对象向回收空间移动,这样的话,会带来解决内存碎片问题,但是会带来性能问题。

     串行GC:适用于单cpu,过程就是,标记出存活对象,标记完成后,回收没有标记的对象,再把存活对象向都集中在一端,然后把回收的内存变为连续的内存空间。

     并行GC:适用于多cpu,老年代的内存空间比较大,把老年代分割为多个内存空间,使用多线程进行处理。

     并发GC(CMS Concurrent-Mark-Sweep):在并发GC里面会暂停整个应用的是:初始标记和重新标记,这样对整个应用程序影响比较小,但是它在并发标记和回收线程与应用线程抢占cpu资源,容易产生内存碎片。

如何理解并发Gc?

假设现在需要打扫教室,开始让班里面同学都出去,然后对垃圾进行标记,进行清除,但是这时候让同学进来的时候,他们可能继续产生垃圾,这时候需要重新标记,再一次进行清除。

jvm里面的垃圾回收策略:我们一般使用默认情况就可以了(服务器模式:年轻代:并行回收GC.老年代:并行GC),也可以进行调整,自己可以记性百度。

猜你喜欢

转载自blog.csdn.net/weixin_41629878/article/details/85919368