您的位置:首页 > 其它

JVM GC机制 --- (个人简单理解)

2020-06-29 05:03 148 查看

Java GC 一般情况只对线程共享(方法区(常量池、元空间)、堆内存)区域进行垃圾回收、每个区域都有自己的回收机制,特性不同、回收的算法也不一样。

gc 要做的三件事:
    1、确定哪些内存回收 (对象是否可以被回收的两种经典算法: 引用计数法 和 可达性分析算法)
    引用计数法:如果对象的关联引用为0了,就可以被当作垃圾进行收集
    可达性分析算法:可达性分析算法是通过判断对象的引用链是否可达来决定对象是否可以被回收。(不可达就代表找不到)

    2、什么时候回收,回收的区域(堆的新生代、老年代、永久代的垃圾回收时机,MinorGC 和 FullGC)
    
    3、怎么回收 (三种经典垃圾回收算法(标记清除算法、复制算法、标记整理算法)及分代收集算法、分区收集算法 和 七种垃圾收集器)
    
    分代收集算法:新生代的复制算法、老年代的标记整理算法
    分区收集算法:按照划分的不同区域独立回收


    七种垃圾收集器(GC收集器):
    Serial 垃圾收集器(单线程、复制算法):Serial(英文连续)是最基本垃圾收集器,使用复制算法,是骄傲v虚拟机运行在Client模式下默认的新生代垃圾收集器(在1.3之前新生代唯一的垃圾收集器,是单线程的并且在对垃圾收集的同时必须停掉其他所有的工作线程,直到垃圾收集结束)
    ParNew垃圾收集器:其实是Serial收集器的多线程版本
    Parallel Scavenge 收集器(多线程复制算法、高效):Parallel Scavenge 收集器也是一个新生代垃圾收集器,它重点关注的是程序达到一个可控制的吞吐量,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

    Serial Old 收集器(单线程标记整理算法 ):运行在Client默认的java虚拟机默认的年老代垃圾收集器。 
    Parallel Old 收集器(多线程标记整理算法):老年代多线程版本
    CMS 收集器(多线程标记清除算法):Concurrent mark sweep(CMS)收集器是一种年老代垃圾收集器,其最主要目标是获取最短垃圾 回收停顿时间,和其他年老代使用标记-整理算法不同,它使用多线程的标记-清除算法。 整个过程分为:初始标记、并发标记、重新标记、并发清楚。
    Garbage first 垃圾收集器:是目前垃圾收集器理论发展的最前沿成果,相比与CMS 收集器,G1 收 集器两个最突出的改进是:
      1、基于标记-整理算法,不产生内存碎片。 
      2、可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收。 G1 收集器避免全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域,并且跟踪这些区域 的垃圾收集进度,同时在后台维护一个优先级列表,每次根据所允许的收集时间,优先回收垃圾 最多的区域。区域划分和优先级区域回收机制,确保 G1 收集器可以在有限时间获得最高的垃圾收 集效率

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: