JVM学习记录3--垃圾收集器

贴个图

  • Serial收集器

    最简单的收集器,单线程,收集器会暂停用户线程,称为"stop the world"。

  • ParNew收集器

    Serial收集器的多线程版本,其它类似。默认线程数为CPU线程数,通过-XX:ParallelGCThreads=? 可以指定线程数

  • Parallel Scavenge收集器

    复制算法,多线程收集器。与ParNew的区别在于,该收集器关注系统吞吐量(吞吐量=用户运行时间/(用户运行时间+垃圾回收时间))。通过-XX:MaxGCPauseMillis 设置垃圾回收时间,数组太小将导致垃圾回收不完全,从而GC频率变高。通关-XX:GCTimeRatio 设置垃圾回收时间和运行时间之比,默认值为99,即允许1%(1/(1+99))。

  • Serial Old 收集器

    Serial 收集器的老生代版本,才用标记-整理算法。

  • Parallel Old收集器

    Parallel Scavenge的老生代版本,采用标记-整理算法。

  • CMS(Concurrent Mark Sweep)

    CMS是一种获取最短时间停顿为目标的收集器。采用标记-整理算法,但是比上述的更为复杂。

    • 初始标记(CMS initial mark)
    • 并发标记(CMS concurrent mark)
    • 重新标记(CMS remark)
    • 并发清除(CMS concurrent sweep)

    CMS是一个优秀的垃圾收集器,并发收集,低停顿。但是也有3个显著的缺点:

    • CMS收集器对CPU资源非常敏感。在并发阶段,虽然不会导致用户进程停顿,但还是会占用部分CPU,导致吞吐量变低。CMS默认启动的回收线程数为(CPU数量+3)/4,
    • CMS无法清理浮动垃圾,简单说就是在并发阶段,用户程序产生的新的垃圾无法被回收。这因为如此,所以在进行垃圾清理时,内存必须还留有空间给用户线程使用,在默认情况下,CMS收集器会在老生代使用了68%的空间后被激活。可以通过-XX:CMSInitiatingOccupancyFraction 来设置这个值。假如CMS回收期间,预留空间无法满足使用,则会引发“concurrent mode failure”,这时虚拟机会启动备案:临时使用Serial来收集垃圾,这会让停顿时间更长。
    • CMS是基于标记-清理算法的,所以会导致大量的内存碎片。
  • G1收集器

    ? G1收集器是当前最厉害的垃圾收集器,简单来说就是Parallel Scavenge的升级版。

    G1收集器采用标记-整理算法,不会产生内存碎片。而且G1收集器可以精确的控制停顿,能让使用者设置一个M毫秒的时间段,垃圾回收时间一定会在M毫秒内。

    ? G1收集器可以实现在基本不牺牲吞吐量的前提下低停顿完成垃圾回收,是因为它能够极力地避免全区域的垃圾回收。G1收集器将堆(包括新生代,老生代)划分为多个区块,并生成一个优先级列表,优先回收垃圾最多的区块。

原文地址:https://www.cnblogs.com/duangL/p/11575074.html

时间: 2024-08-02 03:44:46

JVM学习记录3--垃圾收集器的相关文章

JAVA程序员养成计划之JVM学习笔记(2)-垃圾收集管理

本文对JVM垃圾收集进行说明,包括三种不同算法(标记复制.标记清除.标记整理),以及七种不同的垃圾收集器(Serial,ParNew,Serial Scavenge, CMS, Serial Old, Parallel Old, G1) 持续更新中- - 1. 垃圾回收相关概念 1.1. 垃圾回收对象 说到垃圾收集,首先得确定哪些是可回收的对象,这里涉及到java的四种引用方式,即强.软.弱.虚四类引用. 强引用:即普遍存在的对对象的引用,如指向通过new创建的对象 软引用:即程序运行非必须的对

【深入理解JVM】:HotSpot垃圾收集器

相关概念 并发和并行 这两个名词都是并发编程中的概念,在谈论垃圾收集器的上下文语境中,它们可以解释如下. 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态. 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上. Minor GC 和 Full GC 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以M

jvm学习记录-对象的创建、对象的内存布局、对象的访问定位

简述 今天继续写<深入理解java虚拟机>的对象创建的理解.这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录. (此文中所阐述的内容都是以HotSpot虚拟机为例的.) 对象的创建 java程序在运行过程中无时无刻都有对象被创建出来,那么创建对象是个怎么样的过程呢?还是看看我自己的理解吧. 判断是否已经执行类加载 当虚拟机遇到一条new指令时 ,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载

JVM之几种垃圾收集器简单介绍

本文中的垃圾收集器研究背景为:HotSpot+JDK1.7 一.垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代.三个属于年老代,G1属于横跨年轻代和年老代的算法. JVM会从年轻代和年老代各选出一个算法进行组合,连线表示哪些算法可以组合使用 二.各个垃圾收集器说明 1.Serial(年轻代) 年轻代收集器,可以和Serial Old.CMS组合使用 采用复制算法 使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止 client模式年轻代默认算法 G

JVM学习记录1--JVM内存布局

先上个图 这是根据<Java虚拟机规范(第二版)>所画的jvm内存模型. 程序计数器:程序计数器是用来记录当前线程方法执行顺序的,对应的就是我们编程中一行行代码的执行顺序,如分支,跳转,循环,异常处理等.所以在多线程下,程序计数器必然是线程隔离的,每个线程都有自己独立的程序计数器.注意,Java虚拟机中的程序计数器指向正在执行的字节码地址. 本地方法栈:本地方法栈时用来保存本地方法,即jvm调用外部的方法,比如操作系统本身的方法,或者自定义的c方法,这类方法都带有native关键字.这类又被成

详解 JVM Garbage First(G1) 垃圾收集器

前言    Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命.如果使用Java 8/9,那么有很大可能希望对G1收集器进行评估.本文详细首先对JVM其他的垃圾收集器进行总结,并与G1进行了简单的对比:然后通过G1的内存模型.G1的活动周期,对G1的工作机制进行了介绍:同时还在介绍过程中,描述了可能需要引起注意的优化点.笔者希望通过本文,让有一定JVM基础的读者能尽快掌握G1的知识点. 第一章 概述 G1(Garb

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

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

JVM中的G1垃圾收集器

G1 垃圾收集器是Jdk7的新特性之一.Jdk7+版本都可以自主配置G1作为JVM GC选项: 作为JVM GC算法的一次重大升级.JDK7u后G1已相对稳定.且未来计划替代CMS.所以有必要深入了解下:不同于其他的分代回收算法.G1将堆空间划分成了互相独立的区块.每块区域既有可能属于O区.也有可能是Y区,且每类区域空间可以是不连续的(对比CMS的O区和Y区都必须是连续的).这种将O区划分成多块的理念源于:当并发后台线程寻找可回收的对象时.有些区块包含可回收的对象要比其他区块多很多.虽然在清理这

JVM学习记录-对象已死吗

前言 先来回顾一下,在jvm运行时数据区,分为两部分,一个部分是线程共享区,主要包括堆和方法区,另一部是线程私有区分包括本地方法栈,虚拟机栈和程序计数器.在线程私有部分的三个区域是随着线程生和灭的.栈中的栈帧随着方法的进入和退出而执行着出栈和入栈操作.每一个栈帧所用内存大小在类结构确定下来时就已知了.因此这线程私有区的内存分配和回收都具备确定性,简单概括的说:这部分内存在类加载时分配,在线程结束时回收.(个人理解) 而线程共享区(堆和方法区)则不一样,一个方法中的多个分支需要的内存可能不一样,只