Java GC 知识点

losetowin 发布于:2017-5-21 17:35 分类:Java  有 831 人浏览,获得评论 0 条 标签: java GC 

本文地址:http://www.dutycode.com/JAVA_GC_zhishidian.html
除非注明,文章均为 www.dutycode.com 原创,欢迎转载!转载请注明本文地址,谢谢。
GC算法
    
引用计数 无法处理循环引用的问题
标记清除算法
1、从根节点开始标记所有被引用的对象
2、遍历整个堆,把未标记的对象清除。

会产生Stop-The-World,产生内存碎片。
复制算法
把内存空间划分为两个相等的区域,每次只使用一个区域。GC时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。因为只复制正在使用中的,所以复制成本比较小。复制过去之后会做相应的内存整理,不会产生内存碎片的情况。

缺点:需要使用两倍的内存。
标记压缩(整理)算法
结合标记清除和复制算法的优点。
1、从根节点开始标记所有被引用的对象。
2、遍历整个堆,清除未标记的对象,同时将存活的对象压缩到堆中的其中一块,按顺序排放。 不会产生内存碎片,也避免了复制算法的空间浪费问题。

分代回收算法
基于对象的生命周期分析后得出的收集算法。
分为年轻代,年老代,永久代。针对于不同的生命周期的对象分别使用上面的算法进行回收。

判定对象可回收(可达性)
引用计数方式 给对象增加一个引用计数器,当有地方引用他时,计数器+1, 引用失效时,计数器-1。当计数器=0时,则对象可回收。
缺点:无法解决对象相互引用的情况(计数器恒为1)
根搜索算法
指定一系列叫做“GCRoots”的对象,以这些对象作为起点开始搜索,如果对象不在搜索路径上的时候(即不可达),将被认为可回收。

可以作为GC Root的对象如下:
虚拟机栈(栈桢中的本地变量表)中引用的对象。
方法区中类静态属性引用的对象。
方法区中常量引用的对象。
本地方法栈中JNI(即Native方法)引用的对象


Snip20170514_7.png

垃圾回收器
Serial收集器(串行收集器)
最古老的收集器
只使用一个线程进行回收,会产生较长时间的停顿(STW)
新生代和老年代使用串行回收;
新生代复制算法,老年代标记-压缩算法。
垃圾回收过程产生STW

-XX:+UseSerialGC 使用串行收集器
ParNew收集器(并行收集器)
Serial收集器的多线程版本
新生代并行,老年代串行回收。
新生代复制算法,老年代标记-压缩算法。

-XX:+UseParNewGC  ParNew收集器
-XX:ParallelGCThreads 限制线程数量
Parallel收集器
类似ParNew收集器。
更关注系统的吞吐量。
可通过参数来打开自适应调节策略,虚拟机根据当前系统的运行情况收集性能监控信息,动态调整这个参数信息以提供最合适的停顿时间或者最大的吞吐量。
也可以通过参数控制GC的停顿时间不超过多少毫秒或者比例。
新生代复制,老年代标记-压缩。
老年代串行

-XX:+UseParallelGC  使用Parallel收集器


-XX:GCTimeRatio JVM吞吐量要达到的目标值。
更准确地说,-XX:GCTimeRatio=N指定目标应用程序线程的执行时间(与总的程序执行时间)达到N/(N+1)的目标比值。 例如,通过-XX:GCTimeRatio=9我们要求应用程序线程在整个执行时间中至少9/10是活动的(因此,GC线程占用其余1/10)。 基于运行时的测量,JVM将会尝试修改堆和GC设置以期达到目标吞吐量。 -XX:GCTimeRatio的默认值是99,也就是说,应用程序线程应该运行至少99%的总执行时间。

-XX:MaxGCPauseMillis JVM最大暂停时间的目标值(毫秒)


ParallelOld收集器
Parallel收集器的老年代版本。
使用多线程和标记-压缩算法。
老年代并行。

 -XX:+UseParallelOldGC 使用Parallel收集器
CMS收集器
以获取最短回收停顿时间为目标的收集器。
基于标记-清除算法。

初始标记(STW)仅是标记GCRoot能直接关联到的对象,速度很快。
并发标记
重新标记(STW)修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短
并发清除


老年代收集器 ,新生代使用ParNew
并发标记和并发清除耗时最长。


优点:并发收集,低停顿
缺点:产生大量内存碎片,并发阶段吞吐量降低。

-XX:+UseConcMarkSweepGC  使用CMS收集器

 -XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次碎片整理;整理过程是独占的,会引起停顿时间变长

-XX:+CMSFullGCsBeforeCompaction  设置进行几次Full GC后,进行一次碎片整理

-XX:ParallelCMSThreads  设定CMS的线程数量(一般情况约等于可用CPU数量)
G1收集器 小编还未整理完

版权所有:《攀爬蜗牛》 => 《Java GC 知识点
本文地址:https://www.dutycode.com/JAVA_GC_zhishidian.html
除非注明,文章均为 《攀爬蜗牛》 原创,欢迎转载!转载请注明本文地址,谢谢。