垃圾收集器ParNew,CMS

垃圾收集算法
分代收集理论
根据不同代选用不同的算法,年轻代用一种算法,老年代用一种算法
标记-复制算法
分为两个区,一个区空闲,一个区放对象,做gc时标记垃圾对象或者标记非垃圾。把非垃圾对象整齐的复制到空闲区。复制完成后一次性清理掉。
标记-清除算法
标记非垃圾对象,把剩余空间全部清除;
存在问题:空间碎片化,对象的分配需要整块的空间;
可能存在很多对象,需要标志很长时间。
标记-整理算法
标记非垃圾对象,将非垃圾整齐的挪(复制过去,先不管垃圾对象,如果有垃圾对象,直接覆盖)到角落,再去销毁垃圾对象。空间规整;

垃圾收集器分类
Serial:串行,单线程,可用于年轻代和老年代;适合单核CPU,一般没什么用了。
Parallerl:并发,多线程,可用于年轻代和老年代,不能和CMS配合使用。适用于2G-3G这样大小的内存;
ParNew:用于年轻代并发多线程,与Parallerl几乎没什么区别,但是可以和CMS配合使用;
CMS:适合比较大容量的内存,目前主流老年代垃圾收集器和ParNew配合使用;
CMS垃圾收集过程:
1、初始标记:标记所有gc roots直接引用对象(停止其他所有线程,启动STW,因为只找直接引用对象,所以效率很高);(程序不断在运行,不断有新的变量引用新的对象,所以要停止)
2、并发标记:运行标记(三色标记中的增量更新法),找完堆里所有引用对象的同时,允许用户线程一起运行。(时间很长,占到CMS回收垃圾时间的80%,但是因为和用户线程同时运行,用户感知不到)
3、重新标记:修正并发标记时运行程序产生的变动,这个时间也很难段只会比初始标记长一点点;(停止用户所有线程)
4、并发清理:开启用户的线程,并清理未标记的对象,如果这个时间添加新得对象会被标记成黑色不会做清理;
5、并发重置:重置本次GC过程中的标记数据;
缺点:
1、用户线程和垃圾回收机制会争抢CPU资源
2、无法处理浮动垃圾(详细,增量更新有说)
3、回收算法使用 “标记清除”,会产生大量的碎片,但是可以设置参数,开启碎片整理;
4、并发模式失败:做full gc就是因为老年代没什么空间了,所以在做并发标记或者并发处理时,用户线程还是在跑,万一这个时候发来一个大对象就会导致变成单线程的垃圾回收机制。会变得非常慢。我们可以通过参数设置,比如设定当老年代得空间达到90%的时候就开始做full gc;
cms参数:(不需要知道参数怎么写,到时候查,知道有什么参数即可)
(带有-X参数表示不稳定参数,X越多代表命令越不稳定,这些参数很可能在以后的版本就会改变)
启用cms;
并发的GC线程数(一般不用改变,他会根据cpu的核数来自动设置);
启用标记整理;
多少次full gc做一次标记整理;
设置老年代百分之多少可以做full gc;
设置自动调整老年代百分之多少时full gc,只有第一次根据上面那个参数走(这样更好);
设置cms full gc之前先做一次minor gc,减少full gc时间(一般关系不大,没啥用);
设置初始标记为多线程;
设置重新标记的时间;
三色标记:
黑色:表示这个对象及其所有引用的对象都被扫描了;
灰色:已经被gc访问过了,但是至少还有一个引用没有被扫描;
白色:从未被访问过,标记为垃圾对象;
增量更新
不是垃圾的对象,并发标记后又变成垃圾对象。原本是垃圾的对象后来又变成非垃圾对象(非常严重的BUG)。在并发标记的时候,对那些新增的引用(做赋值)的源头重新标记为灰色,等到重新标记的时候,就会重新扫描,把这些对象都变成黑色。这样在清理的时候就不会被清理了。无法处理那些非垃圾对象变成垃圾对象,只能依靠下次GC的时候处理,这也是会产生浮动垃圾的原因。(重新标记更是会对在并行标记新生成的gc roots做扫描,下面的原始快照也一样)
原始快照
灰色对象要删除指向白色对象的引用时,通过写屏障记录这一引用,在重新标记的时候,以这个灰色对象为根重新扫面就能扫描到这个白色对象,然后把这个白色对象变黑(很可能就变成了浮动垃圾)
写屏障
类似AOP切面编程,在写的时候可以插入一些代码;在写前写后都可以做操作;
记忆集与卡表
记忆集相当于卡表的接口,卡表算是记忆集的实现;
年轻代做minor gc的时候,也要考虑到老年代中对年轻代的引用,但是老年代的东西的是很大的,而且一般老年代对年轻代的引用是非常少的。如果每次做minor gc的时候都去扫描一次老年代非常的消耗时间,所以就有了记忆集这种东西,把老年代的对年轻代的引用放在一个集合里,当做minor gc的时候就去扫描这些集合里对象的引用;
卡表实现记忆集具体情况:老年代划分一块一块小区域(512字节),称为页内存也就是card,只要卡页其中有一个对象引用了年轻代的对象,就把卡页标记为dirty(脏的);我们做minor gc的时候就要去扫描,Cradtable(卡表),底层实现就是01010101之类的,0表示不脏,1表示脏,也记录每个卡页的内存地址;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为什么要学JVM1、一切JAVA代码都运行在JVM之上,只有深入理解虚拟机才能写出更强大的代码,解决更深层次的问题。2、JVM是迈向高级工程师、架构师的必备技能,也是高薪、高职位的不二选择。3、同时,JVM又是各大软件公司笔试、面试的重中之重,据统计,头部的30家互利网公司,均将JVM作为笔试面试的内容之一。4、JVM内容庞大、并且复杂难学,通过视频学习是最快速的学习手段。课程介绍本课程包含11个大章节,计102课时,无论是笔试、面试,还是日常工作,可以让您游刃有余。第1章 基础入门,从JVM是什么开始讲起,理解JDK、JRE、JVM的关系,java的编译流程和执行流程,让您轻松入门。第2章 字节码文件,深入剖析字节码文件的全部组成结构,以及javap和jbe可视化反解析工具的使用。第3章 类的加载、解释、编译,本章节带你深入理解类加载器的分类、范围、双亲委托策略,自己手写类加载器,理解字节码解释器、即时编译器、混合模式、热点代码检测、分层编译等核心知识。第4章 内存模型,本章节涵盖JVM内存模型的全部内容,程序计数器、虚拟机栈、本地方法栈、方法区、永久代、元空间等全部内容。第5章 对象模型,本章节带你深入理解对象的创建过程、内存分配的方法、让你不再稀里糊涂。第6章 GC基础,本章节是垃圾回收的入门章节,带你了解GC回收的标准是什么,什么是可达性分析、安全点、安全区,四种引用类型的使用和区别等等。第7章 GC算法与收集器,本章节是垃圾回收的重点,掌握各种垃圾回收算法,分代收集策略,7种垃圾回收器的原理和使用,垃圾回收器的组合及分代收集等。第8章 GC日志详解,各种垃圾回收器的日志都是不同的,怎么样读懂各种垃圾回收日志就是本章节的内容。第9章 性能监控与故障排除,本章节实战学习jcmd、jmx、jconsul、jvisualvm、JMC、jps、jstatd、jmap、jstack、jinfo、jprofile、jhat计12种性能监控和故障排查工具的使用。第10章 阿里巴巴Arthas在线诊断工具,这是一个特别小惊喜,教您怎样使用当前最火热的arthas调优工具,在线诊断各种JVM问题。第11章 故障排除,本章会使用实际案例讲解单点故障、高并发和垃圾回收导致的CPU过高的问题,怎样排查和解决它们。课程资料课程附带配套项目源码2个159页高清PDF理论篇课件1份89页高清PDF实战篇课件1份Unsafe源码PDF课件1份class_stats字段说明PDF文件1份jcmd Thread.print解析说明文件1份JProfiler内存工具说明文件1份字节码可视化解析工具1份GC日志可视化工具1份命令行工具cmder 1份学习方法理论篇部分推荐每天学习2课时,可以在公交地铁上用手机进行学习。实战篇部分推荐对照视频,使用配套源码,一边练习一遍学习。课程内容较多,不要一次性学太多,而是要循序渐进,坚持学习。      
CMS(Concurrent Mark Sweep)是一种并发的垃圾回收器,它是在 JDK 1.5 中引入的,主要用于减少 Full GC 的停顿时间CMS 的工作分为以下四个阶段: 1. 初始标记(Initial Mark):首先,停止应用程序的所有线程,然后标记所有与 GC Root 直接关联的对象,并记录下这些对象的信息。 2. 并发标记(Concurrent Mark):在初始标记阶段之后,CMS 开始对堆内存进行并发标记,即标记所有与 GC Root 间接关联的对象。在此期间,应用程序的线程可以继续运行,不需要停顿。 3. 重新标记(Remark):并发标记过程中,由于应用程序的线程仍在运行,可能会产生新的对象被引用,因此需要重新标记一次,以标记所有遗漏的对象。 4. 并发清除(Concurrent Sweep):在重新标记完成后,开始并发地清除所有未被标记的对象。 需要注意的是,CMS 垃圾回收器有一定的缺点: 1. CMS 只能处理老年代的垃圾回收,不能处理年轻代的垃圾回收,因此需要和其他垃圾回收器(如 ParNew)配合使用。 2. CMS 垃圾回收器在并发执行垃圾回收时,会消耗一定的 CPU 资源,可能会对应用程序的性能产生影响。 3. CMS 垃圾回收器使用了“标记-清除”算法,可能会产生内存碎片,进而导致 Full GC 的频繁发生,影响应用程序的性能。 因此,在使用 CMS 垃圾回收器时,需要根据应用程序的实际情况进行调优,以达到最佳的性能表现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值