java虚拟机常见的几种垃圾收集器简介

新生代收集器

       Serial收集器

它是最基本、历史最悠久的收集器,在JDK1.3.1之前是虚拟机新生代收集的唯一选择。它是一个单线程的收集器,到现在为止,它依然是虚拟机运行在Client模式下的默认的新生代收集器。优点:简单高效。

特点:只会使用一个CPU或一条收集线程去完成垃圾收集工作,在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。它没有线程交互的开销,所以可以获得最高的单线程收集效率。

 

ParNew收集器

Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为和Serial收集器完全一样。是Server模式下的虚拟机中首选的新生代收集器。目前只有它能与CMS收集器配合工作。是-XX:+UseConcMarkSweepGC选项后的默认新生代收集器,也可以使用-XX:+UseParNewGC选项来强制制定它。默认开启的收集线程数与CPU的数量相同。可以使用-XX:ParallelGCThreads参数来限制垃圾收集的线程数。

Parrallel Scavenge收集器

此收集器的关注目标是达到一个可控制的吞吐量。高吞吐量可以最高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。

吞吐量=运行用户代码的时间/(运行用户代码时间+垃圾收集时间)

-XX:MaxGCPauseMillis控制最大垃圾收集停顿时间

-XX:GCTimeRatio直接设置吞吐量大小

-XX:UseAdaptiveSizePolicy开启自适应调节策略

老年代收集器

Serial Old收集器

Serial收集器的老年代版本,使用“标记-整理”算法

Parrallel Old收集器

Parrallel Scavenge老年代版本,使用多线程和“标记-整理”算法,

CMS(Concurrent Mark Sweep)收集器

基于“标记-清除”算法实现,以获取最短回收停顿时间为目标的收集器,主要用于重视服务的响应速度的应用如B\S系统的服务端。

过程:

初始标记:需要Stop The World,只是标记一下GC Roots能关联到的对象,速度很快。

并发标记:进行GC Root Tacing的过程。

重新标记:需要Stop The World,修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,停顿时间比初始标记阶段稍长,但远比并发标记阶段短。

并发清除:进行并发清除。

缺点:

1、对CPU资源敏感,会占用一部分线程资源,默认启动线程数量是(CPU数量+3)/4

2、无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败从而导致另一次Full GC的产生。

CMS默认在老年代使用了68%的空间后就会被激活,可以适当调高参数-XX:CMSInitiatingOccupancyFraction的值来提高触发百分比,以便降低内存回收次数以获取更好的性能。但不能设置太高,要预留适当的内存供程序使用,否则可能会出现“Concurrent Mode Failure”导致虚拟机启动后备预案临时启用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿的时间就很长了。

3、可能会产生大量的空间碎片,导致提前出发一次Full GC。

参数-XX:UseCMSCpactAtFullCollection,设置CMS在完成垃圾收集之后是否要进行一次内存碎片整理。仅在使用CMS收集器时生效

参数-XX:FullGCsBeforeCompaction,设置CMS收集器在进行若干次垃圾收集之后在启动一次内存碎片整理。仅在使用CMS收集器时生效

G1收集器

基于“标记-整理”算法实现,可以非常精确的控制停顿。(//to do)

原文地址:https://www.cnblogs.com/huster-huwentao/p/9329106.html

时间: 2024-10-09 10:43:52

java虚拟机常见的几种垃圾收集器简介的相关文章

深入理解Java虚拟机之读书笔记二 垃圾收集器

1.对象已死? a.引用计数算法:缺点是它很难解决对象之间的相互循环引用的问题,Java语言中没有选用它. b.根搜索算法(GC Roots Tracing):通过一系列的名为"GC Roots"的对象作为起始点,开始向下搜索,走过的路径称为引用链,当一个对象没有任何引用链相连,表面此对象不可达.在Java语言中,可作为GC Roots的对象包括: 虚拟机栈(栈帧中的本地变量表)中的引用的对象. 方法区中的类静态属性引用的对象. 方法区中的常量引用的对象. 本地方法栈中JNI的引用的对

《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一

Grabage Collection      GC GC要完成的三件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随线程而生,随线程而灭. 栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈的操作. 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此, 这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需过多考虑回收的问题. 因为方法结束或者线程结束时,内存自然就跟着回收了. 而ja

java虚拟机学习(五)--垃圾收集器总结

JVM--垃圾收集器总结 一.垃圾收集器概览 收集算法是内存回收的方法论,垃圾收集据是内存回收的具体实现.Java虚拟机规范中对垃圾收集器应该如何实现没有规定,不同的厂商.不同版本的虚拟机所提供的垃圾收集器可能会有很大差别,一般都会提供参数供用户根据自己的所用特点和要求组合出各个年代所使用的收集器.下面是基于JDK 1.7 Update 14 之后的HotSpot 虚拟机垃圾收集器.如果两个收集器之间有连线就说明它们可以搭配使用.直到现在还没有最好的收集器,更加设有万能的收集器,只是对具体应用选

JVM常见的七种垃圾收集器的简单比较

1.Serial收集器曾经是虚拟机新生代收集的唯一选择,是一个单线程的收集器,在进行收集垃圾时,必须stop the world,它是虚拟机运行在Client模式下的默认新生代收集器. 2.Serial Old是Serial收集器的老年代版本,同样是单线程收集器,使用标记整理算法. 3.ParNew收集器是Serial收集器的多线程版本,许多运行在Server模式下的虚拟机中首选的新生代收集器,除Serial外,只有它能与CMS收集器配合工作. 4.Parallel Scavenge收集器也是新

《深入理解JAVA虚拟机》----------第三章 垃圾收集器与内存分配策略,读后感(中)

1.垃圾收集器 1.1 Serial收集器 这个收集器是一个单线程的收集器,它在进行垃圾收集时,必须暂停其他所有的工作线程. 它是虚拟机运行在Client模式下的默认新生代收集器,它简单而高效. 1.2 ParNew收集器 其实就是Serial收集器的多线程版本,目前只有它能与CMS收集器配合工作. 原文地址:https://www.cnblogs.com/technologykai/p/10622586.html

JVM(HotSpot)7种垃圾收集器

7种垃圾收集器作用于不同的分代,如果两个收集器之间存在连续,就说明他们可以搭配使用. 从JDK1.3到现在,从Serial收集器->Parallel收集器->CMS->G1,用户线程停顿时间不断缩短,但仍然无法完全消除. 1.Serial收集器(串行收集器) Serial收集器是最基本.发展历史最悠久的收集器,曾是(JDK1.3.1之前)虚拟机新生代收集的唯一选择. Serial收集器是一个单线程的收集器.“单线程”的意义不仅仅是它只会使用一个CPU或一条收集器线程去完成垃圾收集工作,更

HotSpot的7种垃圾收集器组合

HotSpot共有7种垃圾收集器,3个新生代垃圾收集器,3个老年代垃圾收集器,以及G1,一共构成7种可供选择的垃圾收集器组合. 新生代与老年代垃圾收集器之间形成6种组合,每个新生代垃圾收集器都对应2种组合. Serial Old(MSC)可以与所有新生代收集器进行组合,共3种组合JVM仅指定新生代垃圾收集器的情况下,默认老年代采用Serial Old垃圾收集器(带压缩):-XX:+UseSerialGCSerial (DefNew) + Serial Old(Serial Mark Sweep

Java虚拟机笔记 – JVM 自定义的类加载器的实现和使用2

1.用户自定义的类加载器: 要创建用户自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定类的名字,返回对应的Class对象的引用. findClass protected Class<?> findClass(String name) throws ClassNotFoundException 使用指定的二进制名称查找类.此方法应该被类加载器的实现重写,该实现按照委托模型来加载类.在通过父

Java中常见的5种WEB服务器介绍

这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的Web服务器,比较常用的有Tomcat.Resin.JBoss.WebSphere 和 WebLogic 等,下面将分别进行介绍. Tomc