码迷,mamicode.com
首页 > 编程语言 > 详细

JVM 垃圾回收算法和对gc耗时的影响

时间:2019-11-29 10:41:24      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:运用   cpu   fir   enabled   时机   加法   适合   lol   enable   

引用计数法 :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耗时的影响

标签:运用   cpu   fir   enabled   时机   加法   适合   lol   enable   

原文地址:https://www.cnblogs.com/fubinhnust/p/11956035.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!