JVM 垃圾回收算法和对gc耗时的影响
Posted fubinhnust
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM 垃圾回收算法和对gc耗时的影响相关的知识,希望对你有一定的参考价值。
引用计数法 :Java虚拟机并未采用这种算法
缺点:1.对象的循环引用 2.伴随加法和减法操作,有一定的性能开销
-可达对象
-不可达对象 : 通过根对象进行引用搜索
复制算法:通常存活对象很少,这个算法效率高,也没有空间碎片,但是内存折半
标记清除法:会产生空间碎片
标记压缩法:老年代存活对象多,复制算法不划算,所以使用标记清除算法的优化版 , 会在标记后把存活对象压到一端。等同于标记后再进行一次碎片整理。也加标记清除压缩算法
分代,分区的思想
新生代使用类复制算法的思想。from和to区
分代算法的叫法是上面算法的综合运用,使用了上面算法的各自优势。
卡表:记录新生代对象引用在老年代是否使用,用于加快新生代的回收速度。
分区算法:把堆分为多个不同的小区间,每个区间独立回收。减少大块堆gc的停顿时间。
判断对象可达性的依据
1.可触及:从根节点开始,对象可达
2.可复活:对象引用已释放,但有可能在finalize函数中复活
3.不可触及:对象finalize函数被调用,并且没复活,finalize只会被调用一次(不要再使用这个函数了),资源释放推荐try-catch-finally
引用和可触及性的强度
1.引用级别:强,软,弱,虚, 后面三种对象在一定场景下是可以被回收的
软引用:在堆空间不足时,会被回收,所以这种不会引起内存溢出
弱引用 :发现就被回收,取决于下一次垃圾回收的时机
很适合保存缓存数据
虚引用 :用于跟踪垃圾回收的过程
STW:Stop-The-World 垃圾回收的停顿现象
使用超大的新生代,from和to区,会导致复制算法复制大量的对象,会很大程度上延长gc的时间
垃圾回收器
垃圾收集算法只是理论基础,垃圾收集器才是项目中的最佳实践。
垃圾收集器种类及参数设置
-XX:+UseSerialGC 新生代和老年代都使用串行收集器 ## ParNew 指定线程数量 -XX:ParallelGCThreads,默认值cpu< 8个=cpu数,大于8个(3+((5*CPU个数)/8))
-XX:+UseParNewGC 新生代ParNew(多线程的串行收集器)收集器,老年代使用串行收集器
## ParallelGC注重吞吐量,支持自适应的GC调节策略 ## 控制吞吐量的参数:-XX:MaxGCPauseMillis=最大收集停顿时间,-XX:GCTimeRatio=吞吐量 n默认=99则是使用1/(1+n)的时间来做垃圾回收 ## -XX:UseAdaptiveSizePolicy 打开自适应GC策略 -XX:+UseParallelGC 新声代使用parallelGC收集器,老年代使用串行收集器 ## ParallelOldGC 作用于老年代的并行收集器,也是注重吞吐量的,jdk1.6才能使用 -XX:+UseParallelOldGC 新生代使用ParallelGC收集器,老年代使用ParallelOldGC收集器
## CMS关注系统停顿时间 ## 步骤 : 3标记 2清理 1重置 ## 标记根对象(初始标记) -> 标记所有对象(并发标记) -> 清理前准备以及控制停顿时间(预清理) -> 修正并发标记数据(重新标记) -> 清理垃圾(并发清理) -> 重置(并发重置) ## 并发xx ,可以和用户线程一起执行 -XX:-CMSPrecleaningEnabled 关闭预清理 ## (设置的并发线程数+3)/4 = 设置4个并发线程意味着只有一个垃圾收集的并发线程 -XX:+UseConcMarkSweepGC 新生代使用ParNew回收器,老年代使用CMS -XX:+CMSInitiatingOccupancyFraction 回收阀值,默认68,老年代使用率达到68%时会执行CMS回收。 -XX:+UseCMSCompactAtFullCollection CMS会产生垃圾碎片,这个参数使用多少次CMS回收后,会进行内存压缩。 ## CMS回收Perm区 -XX:+CMSClassUnloadingEnabled
## G1回收器 Garbage-First JDK1.7 # G1属于分代,结构上不要求各个区域连续,使用了分区算法 ## 四个阶段 :新生代GC 并发标记周期 混合收集 FullGC -XX:UseG1GC 开启G1参数 -XX:MaxGCParseMillis 最大停顿时间 -XX:ParallelGCThreads 工作线程数量 -XX:InitiatingHeapOccupancyPercent 比例达到比例,触发并发标记周期 -XX:+DisableExplicitGC 禁止显示触发FullGC -XX:+ExplicitGCInvokesConcurrent CMS和G1在FullGC时,使用System.gc()才会并发执行
|
以上是关于JVM 垃圾回收算法和对gc耗时的影响的主要内容,如果未能解决你的问题,请参考以下文章
GC垃圾回收机制
GC垃圾回收机制
JVM :垃圾回收机制(GC)
JVM学习笔记GC——JAVA预言的垃圾回收
JVM学习笔记GC——JAVA语言的垃圾回收
jvm垃圾回收算法