JVM之GC垃圾回收器4+4+7

GC算法四种 (思想)

引用计数 废弃
复制拷贝 新生代
标记清除 老年代
标记整理 老年代

GC 算法是内存回收的方法论,垃圾收集其就是算法的落实的实现。
目前为止还没有完美的收集器的出现,更加没有万能的收集器,只是针对具体应用最适合的收集器,进行分代收集。

Gc垃圾回收器 (落地实现)

串行垃圾回收器(Serial)
它为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有的用户线程,所以不适合服务环境。
并行垃圾回收器(Parallel)
多个垃圾收集线程并行工作,此时用户线程是暂停的,用于科学计算、大数据处理等弱交互场景。
并发垃圾回收器(CMS)ConcMarkSweep
用户线程和垃圾收集线程同时执行(不一定是并行,可能是交替执行),不需要停顿用户线程,互联网公司多用它,适用对相应时间有要求的场景。
G1 垃圾回收器
G1 垃圾回收器将堆内存分割成不同的区域然后并发的对其进行垃圾回收。

怎么查看服务器默认垃圾收集器是哪个?生产是如何配置垃圾收集器?谈谈你对垃圾收集器的理解?

查看服务器默认垃圾收集器是哪个?
Java -XX:+PrintCommandLineFlags

Java 的 GC 回收的类型:7种
在这里插入图片描述
其中SerialoldGC已经被废弃

垃圾收集器(重点)

在这里插入图片描述
在这里插入图片描述

参数说明
DefNew : Default New Generation
Tenured : Old
ParNew : Parallel New Generation
PSYoungGen : Parallel Scavenge
ParOldGen : Parallel Old Generation

Server/Client 模式分别是什么意思**(工作基本都是Server)**
最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升。
当虚拟机运行在-client模式的时候,使用的是一个代号为C1的轻量级编译器, 而-server模式启动的虚拟机采用相对重量级,代号为C2的编译器,C2比C1编译器编译的相对彻底,服务起来之后,性能更高。
所以通常用于做服务器的时候我们用服务端模式,如果你的电脑只是运行一下java程序,就客户端模式就可以了。当然这些都是我们做程序优化程序才需要这些东西的,普通人并不关注这些专业的东西了。其实服务器模式即使编译更彻底,然后垃圾回收优化更好,这当然吃的内存要多点相对于客户端模式。

新生代

串行 GC (Serial/ Serital Copying)
单线程收集器,在进行垃圾收集时,必须暂停其他所有的工作线程直到它收集结束。简单高效,Client模式下默认新生代垃圾收集器。
参数 -XX:+UseSerialGC
开启后会使用 Serial 新生代 Serial Old 老年代收集器组合
表示:新生代,老年代都会使用串行回收收集器,新生代使用复制算法,老年代使用标记-整理算法。
并行 GC (ParNew)
多线程垃圾回收,也会暂停其他所有线程。
其实就是Serial收集器新生代的并行多线程版本。常见应用场景是配合老年代CMS GC工作。Server模式下默认新生代垃圾收集器
参数 -XX:+UseParNewGC
开启后使用ParNew + Serial Old java8不推荐!!!!!!!
并行回收 GC (Parallel/ Parallel Scanvenge)
串行收集器在新生代和老年代的并行化
可控的吞吐量 :运行用户代码时间/(运行用户代码时间+垃圾收集时间)
自适应调节策略 :虚拟机根据当前系统的运行情况收集性能监控信息,动态调整这些参数以获得最大吞吐量(例如-XX:MaxGCPauseMills)
参数 -XX:+UseParallelGC 或者 -XX: + UseParallelOldGC

老年代

串行 GC (Serial Old/ Serial MSC)
主要用途 1.8以后CMS后备收集器
并行 GC (Parallel Old/ Parallel MSC)
ParallelGC + ParallelOldGC 自动激活
并发标记清除 GC (CMS)*
是一种以获取最短回收停顿时间为目标的收集器,适合应用在互联网站或者 B/S 系统的服务器上,这个类应用尤其重视服务器的响应速度,希望系统停顿时间最短。
CMS 非常适合堆内存大、CPU 核数多的服务器端应用,也是 G1 出现之前大型应用首选收集器。
并发停顿比较少,并发指的是与用户线程一起执行。

参数(微服务架构配)
-XX:+UseConcMarkSweepGC 开启该参数后自动将-XX:+UseParNewGC打开。使用ParNew(新生代)+CMS(老年代)+Serial(CMS出错的后备收集器)组合

过程
1初始标记(initail mark):只是标记一下 GC Roots 能直接关联的对象,速度很快,需要暂停所有的工作线程
2并发标记(concurrent mark 和用户线程一起):进行 GC Roots 的跟踪过程,和用户线程一起工作,不暂停工作线程。
3重新标记(remark):为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程。
4并发清除(concurrent sweep 和用户线程一起):清除 GC 不可达对象,和用户线程一起工作,不暂停工作线程,基于标记结果,直接清除。由于耗时最长的并发标记和并发清除过程中,垃圾收集线程和用户线程可以一起并发工作,所以总体来看 CMS 收集器的内存回收和用户线程是一起并发地执行。
优缺点
优点:并发收集停顿低
缺点:1 并发执行对 CPU 资源压力大,采用的标记清除算法会导致大量碎片。由于并发进行, CMS 在收集与应用线程会同时增加对堆内存的占用,也就是说,CMS 必须要在老年代堆用尽之前完成垃圾回收,否者 CMS 回收失败,将触发担保机制,串行老年代收集器将会以 STW 的方式进行一次 GC,从而造成较大的停顿时间。
2 标记清除算法无法整理空间碎片,老年代空间会随着应用时长被逐渐耗尽,最后将不得不通过担保机制对堆内存进行压缩。CMS 也提供了参数 -XX:CMSFullGCsBeForeCompaction (默认0,即每次都进行内存整理) 来指定多少次 CMS 收集之后,进行一次压
垃圾收集器配置代码总结
配置新生代收集器,老年代收集器会自动配置上。
在这里插入图片描述

如何选择垃圾收集器

单 CPU 或者小内存,单机程序:
-XX:UseSerialGC
多 CPU 需要最大吞吐量,如后台计算型应用:
-XX:UseParallelGC 或者
-XX:UseParallelOldGC
多 CPU 追求低停顿时间,需要快速响应,如互联网应用:-XX:+UseConcMarkSweepGC

G1收集器

见下一章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值