jvm 垃圾回收算法

垃圾回收算法:

  • 标记清除

    • 先扫描堆空间,没有GC root引用的对象进行标记垃圾;
    • 清除垃圾【对垃圾的起始、结束位置进行记录】;
    • 速度快,容易产生碎片内存空间;
  • 标记整理:

    • 先扫描堆空间,没有GC root引用的对象进行标记垃圾;
    • 整理空间,将活动空间已经移动到连续空间;
    • 克服碎片化空间,低效率;
  • 复制算法:

    • 将内存空间分为两片,一个是所有活动对象From,另一个没有对象To;
    • 先扫描堆空间,没有GC root引用的对象进行标记垃圾;
    • 通过copy到另一片空间,实现数据整理,然后交换两片空间;
    • 需要占用双倍内存空间;

    实际的垃圾回收算法,是综合考虑使用上面三种算法;

分代垃圾回收机制

  • 将堆内存划分为:
    • 新生代【生命周期短的对象】:
      • 伊甸园【乐园】:
        • 新产生对象默认生产在伊甸园;
        • 当伊甸园满了后,触发Minor GC,并且采用复制算法,复制到幸存区 TO,并且幸存对象寿命标记+1【在伊甸园是 0,每经历过一次Minor GC 加1】;
        • 并且将幸存区To重名为幸存区From,将幸存区From重名为幸存区To;
        • 当伊甸园第二次满后,将伊甸园和幸存区from,使用复制算法,复制到幸存区TO,并将幸存对象,寿命标记+1,然后交换幸村区命名;
        • Minor GC会触发stop the world,暂停其他用户线程,等待垃圾回收结束,线程在恢复运行;
      • 幸存区 From;
        • 当幸存区From内的对象的寿命值,超过一个阈值【15,4bit】,则将该对象晋升到老年代空间,不同垃圾回收器,阈值不一样;
        • 当新生代空间不足的时候,可以直接将大对象晋升到老年代,而不会触发Minor GC;
      • 幸存区To
    • 老年代【生命周期长的对象】:
      • 当老年空间不足时候,首先尝试触发Mnior gc,如果之后空间仍不足,那么触发ful gc,full gc 的stop the world【STW】的时间更长,如果还不足,则报错:OutOfMemoryError;
      • 当在一个子线程内因为内存不足,报错,不会影响其他线程程序进程;
posted @ 2025-03-09 10:14  烟雨断桥  阅读(23)  评论(0)    收藏  举报