GC垃圾回收算法总结

闲着没事总结下java虚拟机的垃圾回收算法。

哪些对象会被回收

两种方式:

  • 第一种:引用计数法:只要一个对象被引用,计数就+1,释放引用,就-1,但是无法解决两个对象互相引用的问题
  • 第二种:对象可达状态分析
    主要包括:

    1. 虚拟机栈中引用的对象。
    2. 方法区中类静态属性实体引用的对象。
    3. 方法区中常量引用的对象。大多数是final修饰的
    4. 本地方法栈中JNI引用的对象。

回收理论算法

  1. 复制算法:将堆内存分成两个区域,当一个区域的一小块内存使用完后,清理未被引用的对象,将剩下的存活的对象复制到另一块内存中,然后清除前一块内存,这样复制效率低下
  2. 标记-清除算法:对堆内存中的对象进行遍历,找到未被引用的对象,然后清除,但是这样会产生大量碎片化内存,浪费内存,降低内存使用率。
  3. 标记-压缩算法:这个主要针对老年代的对象,因为老年代的对象存活率很高,所以需要在一定时间对存活率对象进行压缩至内存一侧,然后清除内存压缩边界以外的内存,这样可以减少内存备份,很好利用内存空间。
  4. 分代算法:堆内存主要分为新生代和老年代,新生代对象大多是新建一次的存活率很低的对象,直接使用复制算法,老年代算法可以使用标记压缩算法

回收工具

  1. Seril收集器:新生代串行,老年代串行,单线程
  2. ParNew收集器:多线程,新生代并行,老年代串行
  3. Parallel收集器:更加关注于系统的吞吐量,新生代复制算法+老年代标记压缩算法
  4. Parallel old收集器,这是jdk1.6以后才有,主要是由新生代parrallel收集器+老年代并行
  5. CMS,current mark sweep,原则是以最短回收停顿时间为主的收集器,其主要是以标记-清除算法来实现的,基本步骤如下:
    初始标记(CMS initial mark)
    并发标记(CMS concurrent mark)
    重新标记(CMS remark)
    并发清除(CMS concurrent sweep)
    其中初始标记是快速标记gc roots能够关联的对象,并发标记主要是GC Roots Tracing的过程,重新标记是并发期间,标记用户从新操作新产生或者变化的对象,稍微比初始标记慢一点,但是比并发标记快很多,并发清除是指清除gc对象。
    由于并发标记和并发清除是最耗时的阶段,收集器可以和用户并发工作的,主要是老年代收集器。
  6. G1收集器,这个不太清楚,见以下链接

https://www.cnblogs.com/ityouknow/p/5614961.html

你可能感兴趣的:(java源码分析)