JVM垃圾收集算法和垃圾收集器

1.分代收集理论:

当前虚拟机的垃圾收集都采用分代收集算法,这种算法没什么新的思想.只是根据对象存活周期的不同将内存分为几块.一般将java堆分为新生代和老年代.这样我们就可以根据各个年代的特点选择合适的垃圾收集算法.比如在新生代中,每次收集都会有大量对象(近99%)死去.所以可以选择复制算法.只需要付出少量对象的复制成本就可以完成收集.老年代对象存活几率比较高.没有额外的空间对它进行担保,所以我们必须选择标记-清除或标记-整理算法进行垃圾收集.标记清除和标记整理会比复制算法慢十倍.

2.标记复制算法:

它可以将内存分为大小相同的两块.每次使用其中的一块.当这一块的内存使用完后.就将还存活的对象复制到另一块去.然后再把使用的空间一次清理掉.这样就使每次的内存回收都是对内存区间的一半进行回收.

内存整理前:

内存整理后:

3.标记清除算法:

算法分为标记和清除阶段.标记存活的对象,统一回收所有未被标记的对象(一般选择这种),也可以反过来,标记所有需要回收的对象.在标记完成以后统一回收.

3.1产生的问题:

效率问题(标记的对象太多,效率不高)

空间问题(标记清除后会产生大量不连续的碎片)

内存整理前:

内存整理后:

4.标记整理算法:

标记过程仍然与标记清除一样,但是后续步骤不是直接对对象回收,而是让所有存活对象向一端移动,然后直接清理掉端边界以外的内存.

5.垃圾收集器:

垃圾收集算法是内存回收的方法论.垃圾收集器是内存回收的具体实现.

6.Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC):

是最基本 历史最悠久的垃圾收集器.从名字就可以看出是一个单线程收集器.单线程不仅仅意味着只会使用一条垃圾收集线程完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须停掉其他工作线程,直到收集结束.

新生代采用复制算法,老年代采用标记-整理算法.

7.Parallel收集器((-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)):

就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集以外,其余控制参数和Serial收集器类似.Parallel收集器关注的是吞吐量(高效率利用CPU).

新生代采用复制算法,老年代采用标记-整理算法.

8.CMS收集器(-XX:+UseConcMarkSweepGC(old)):

CMS收集器是一种以获取最短回收停顿时间为目标的收集器.它非常符合在注重用户体验上的应用,它是HotSpot虚拟机第一款真正意义上的并发收集器,第一次实现了让垃圾收集线程与用户线程(基本上)同时工作.

8.1运行步骤:

初始标记:

暂停所有的其他线程(STW),并记录下gc roots直接能引用的对象,速度很快.

并发标记:

并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行因为用户线程继续运行,可能会导致已经标记过的对象状态发生改变.

重新标记:

重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录.这个阶段停顿时间一般会比初始标记阶段的时间稍长.远远比并发标记时间短.

并发清理:

开启用户线程,同时GC线程开始对未标记的区域清扫.

并发重置:

重置本次GC过程中标记的数据.

8.2缺点:

对CPU资源敏感(会和服务抢资源).

无法处理浮动垃圾.

它使用的标记-清除算法会导致收集结束时会有大量空间碎片产生.

8.3CMS的相关核心参数

  1. -XX:+UseConcMarkSweepGC:启用cms

  2. -XX:ConcGCThreads:并发的GC线程数

  3. -XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩整理(减少碎片)

  4. -XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一

  1. -XX:CMSInitiatingOccupancyFraction: 当老年代使用达到该比例时会触发FullGC(默认是92,这是百分比)

  2. -XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction设

定的值),如果不指定,JVM仅在第一次使用设定值,后续则会自动调整

  1. -XX:+CMSScavengeBeforeRemark:在CMS GC前启动一次minor gc,目的在于减少老年代对年轻代的引

用,降低CMS GC的标记阶段时的开销,一般CMS的GC耗时 80%都在标记阶段

  1. -XX:+CMSParallellnitialMarkEnabled:表示在初始标记的时候多线程执行,缩短STW

  2. -XX:+CMSParallelRemarkEnabled:在重新标记的时候多线程执行,缩短STW;

9.三色标记:

在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。所以引入了三色标记.

9.1黑色:

表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经被扫描过.黑色的对象代表已经扫描过,它是安全存活的,如果有其他对象引用指向了黑色对象,无须重新扫描一遍.黑色对象不可能直接指向某个白色对象.

9.2灰色:

表示对象已经被垃圾收集器访问过,但这个对象至少存在一个引用没有被扫描过.

9.3白色:

表示未被垃圾收集器访问过,显然在可达性分析刚开始的阶段,所有对象都是白色的.若在分析结束阶段,仍然是白色对象,即代表不可达.

语雀地址www.yuque.com/itbosunmian...?

《Go.》 密码:xbkk 欢迎大家访问.提意见.

相关推荐
IT_陈寒14 小时前
SpringBoot自动配置偷偷给我埋了个坑
前端·人工智能·后端
心.c15 小时前
CommonJS和ES Module
javascript·后端·node.js
念何架构之路15 小时前
Go依赖管理
开发语言·后端·golang
Mahir0815 小时前
Spring 全家桶常见注解全解:从入门到精通
java·后端·spring·面试·常见注解
我是一颗柠檬15 小时前
【JDK8新特性】Stream流API上Day4
java·开发语言·后端
我是一颗柠檬15 小时前
【JDK8新特性】方法引用与构造器引用Day3
java·开发语言·后端·intellij-idea
折哥的程序人生 · 物流技术专研15 小时前
《Java 100 天进阶之路》第32篇:Java常用工具类(Objects、Collections、Arrays深入)
java·后端·面试·求职招聘
西凉的悲伤16 小时前
SpringBoot RestTemplate 介绍
java·spring boot·后端·resttemplate
lizhongxuan21 小时前
AIOPS 的自治运维与可验证进化机制
后端