首页 > 其他分享 >jvm之垃圾收集器

jvm之垃圾收集器

时间:2023-04-23 10:36:57浏览次数:26  
标签:收集器 线程 垃圾 jvm Serial Parallel Scavenge


垃圾收集器

先看下图中HotSpot虚拟机所包含的收集器:

jvm之垃圾收集器_java

图中展示了9种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。

  • 新生代收集器:Serial、ParNew、Parallel Scavenge
  • 老年代收集器:CMS、Serial Old、Parallel Old
  • 整堆收集器:G1

几个重要的概念:

  • 并行(Parallel)收集:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态;如ParNew、Parallel Scavenge、Parallel Old;
  • 并发(Concurrent)收集:指用户线程与垃圾收集线程同时执行,如CMS、G1(也有并行);
  • 吞吐量:即CPU用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间))。例如:虚拟机共运行100分钟,垃圾收集器花掉1分钟,那么吞吐量就是99%。

Serial收集器

Serial收集器:串行收集器。

特点:单线程、简单高效,对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。收集器进行垃圾回收时,必须暂停其他所有的工作线程,直到它结束(Stop The World)。

jvm之垃圾收集器_分代回收_02

应用场景:适用于Client模式下的虚拟机。

ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本。

特点:多线程、ParNew收集器默认开启的收集线程数与CPU的数量相同,在CPU非常多的环境中,可以使用-XX:ParallelGCThreads参数来限制垃圾收集的线程数。和Serial收集器一样存在Stop The World问题

应用场景:ParNew收集器是许多运行在Server模式下的虚拟机中首选的新生代收集器,因为它是除了Serial收集器外,唯一一个能与CMS收集器配合工作的。

Parallel Scavenge收集器

与吞吐量关系密切,故也称为吞吐量优先收集器。

特点:属于新生代收集器也是采用复制算法的收集器,又是并行的多线程收集器(与ParNew收集器类似)。

该收集器的目标是达到一个可控制的吞吐量。还有一个值得关注的点是:GC自适应调节策略(与ParNew收集器最重要的一个区别)。

jvm之垃圾收集器_java_03


GC自适应调节策略:Parallel Scavenge收集器可设置-XX:+UseAdptiveSizePolicy参数。当开关打开时不需要手动指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRation)、晋升老年代的对象年龄(-XX:PretenureSizeThreshold)等,虚拟机会根据系统的运行状况收集性能监控信息,动态设置这些参数以提供最优的停顿时间和最高的吞吐量,这种调节方式称为GC的自适应调节策略。

Parallel Scavenge收集器使用两个参数控制吞吐量:

  • XX:MaxGCPauseMillis 控制最大的垃圾收集停顿时间
  • XX:GCRatio 直接设置吞吐量的大小。

Serial Old 收集器

Serial Old是Serial收集器的老年代版本。

特点:同样是单线程收集器,采用标记-整理算法。

应用场景:主要也是使用在Client模式下的虚拟机中。也可在Server模式下使用。

Parallel Old 收集器

是Parallel Scavenge收集器的老年代版本。

特点:多线程,采用标记-整理算法。

应用场景:注重高吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge+Parallel Old 收集器。

jdk8默认的垃圾回收器参数为-XX:+UseParallelGC,对应的垃圾回收器为Parallel Scavenge(新生代)+Parallel Old(老年代)

jvm默认垃圾收集器(JDK789)

  • jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
  • jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
  • jdk1.9 默认垃圾收集器G1

CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。

特点:基于标记-清除算法实现(并未整理压缩)。并发收集、低停顿。

应用场景:适用于注重服务的响应速度,希望系统停顿时间最短,给用户带来更好的体验等场景下。如web程序、b/s服务。

CMS收集器的运行过程分为下列4步:

  • 初始标记:标记GC Roots能直接到的对象。速度很快但是仍存在Stop The World问题。
  • 并发标记:进行GC Roots Tracing 的过程,找出存活对象且用户线程可并发执行。
  • 重新标记:为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。仍然存在Stop The World问题。
  • 并发清除:对标记的对象进行清除回收。

jvm之垃圾收集器_垃圾收集器_04


CMS收集器的内存回收过程是与用户线程一起并发执行的。

CMS收集器的缺点:

  • 对CPU资源非常敏感。
  • 无法处理浮动垃圾,可能出现Concurrent Model Failure失败而导致另一次Full GC的产生。
  • 因为采用标记-清除算法所以会存在空间碎片的问题,导致大对象无法分配空间,不得不提前触发一次Full GC。

更多精彩内容关注本人公众号:架构师升级之路

jvm之垃圾收集器_分代回收_05


标签:收集器,线程,垃圾,jvm,Serial,Parallel,Scavenge
From: https://blog.51cto.com/u_6784072/6216458

相关文章

  • jvm之垃圾回收算法
    垃圾回收算法哪些内存需要回收jvm的内存模型中将内存划分为程序计数器、虚拟机栈、本地方法栈、堆、方法区。其中程序计数器、虚拟机栈、本地方法栈属于线程私有的内存空间,与线程的生命周期保持一致,不需要手动回收内存。方法区中存放的是类的结构信息,对方法区的回收其实就是对类进......
  • jvm之线程上下文加载器与SPI
    线程上下文加载器线程上下文类加载器(ThreadContextClassLoader,简称TCCL)是从JDK1.2开始引入的。类java.lang.Thread中的方法getContextClassLoader()和setContextClassLoader(ClassLoadercl)用来获取和设置线程的上下文类加载器。如果没有通过setContextClassLoader(ClassLoader......
  • jvm如何打破双亲委托机制
    打破双亲委托机制重写父类ClassLoader的loadClass方法packagecom.morris.jvm.classloader;publicclassBreakDelegateClassLoaderextendsMyClassLoader{@OverrideprotectedClass<?>loadClass(Stringname,booleanresolve)throwsClassNotFoundException{......
  • JVM内存模型
    JVM内存模型JVM的内存模型也就是JVM中的内存布局,不要与java的内存模型(与多线程相关)混淆。下图是jdk8jvm内存模型图:程序计数器程序计数器是当前线程所执行的字节码的行号指示器。JVM支持多个线程同时运行,每个线程都会根据CPU时间片来回切换,那么如果当前线程获得时间片了,怎么知道它......
  • Java虚拟机之JVM工具监控调优
    我是攻城师(woshigcs)前几篇我们学习了,JVM里面的运行结构,GC算法,以及各种垃圾收集器的优劣点,那么本篇我们来看下如何使用一些虚拟机性能监控工具,来监控和快速处理故障,当JVM出现一些故障时,我们通常从如下的几个方面进行着手分析,包括运行日志,异常堆栈,GC日志,线程快照(threaddump/javacor......
  • 其他--解封垃圾CSDN的"关注博主即可阅读"限制
    问题缘由其实遇到好博主和好文章,点赞关注是大部分人的基本操作,但不要脸的CSDN为了广告收入强制让用户登录和用户关注的事情太恶心,CSDN真的是中国互联网的耻辱。解除限制以Chrome浏览器为例,在"书签"==>"书签管理器"==>"新增书签"下设置JavaScript:(function(){ varart......
  • JDK,JRE,JVM之间的关系
    JDK,JRE,JVM三者之间的关系JDK=JRE+开发工具集(例如javac编译工具等)JRE=JVM+JavaSE标准类库JDK(Java开发工具包)JRE(Java运行环境)JVM(Java虚拟机)......
  • 一文回顾JVM
     ......
  • os: Debian和Ubuntu系统更新和垃圾清理
    Debian和Ubuntu系统更新和垃圾清理一、查看系统启动时间1.systemd-analyze二、一键纯净更新和垃圾清理1、命令:sudoaptupdate-y&&sudoaptfull-upgrade-y&&sudoaptautoremove-y&&sudoaptautocle......
  • 从原理聊JVM(一):染色标记和垃圾回收算法
    作者:京东科技 康志兴1JVM运行时内存划分1.1运行时数据区域•方法区属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池,属于方法区的一部分,用于存放编译期生成的各种字面量和符号引用。JDK1.8之前,Hotspot虚拟机对方法区......