GC原理---垃圾收集器

垃圾收集器

如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现
Serial收集器
  • 串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。新生代、老年代使用串行回收;新生代复制算法、老年代标记-压缩;垃圾收集的过程中会Stop The World(服务暂停)
  • 参数控制:-XX:+UseSerialGC 串行收集器
ParNew收集器
  • ParNew收集器其实就是Serial收集器的多线程版本。新生代并行,老年代串行;新生代复制算法、老年代标记-压缩
  • 参数控制:-XX:+UseParNewGC ParNew收集器

    -XX:ParallelGCThreads 限制线程数量

Parallel Scavenge收集器
  • Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量。可以通过参数来打开自适应调节策略,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量;也可以通过参数控制GC的时间不大于多少毫秒或者比例;
  • 停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量则可以高效地利用CPU时间,主要适合在后台运算而不需要太多交互的任务。
  • Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间 -XX:MaxGCPauseMillis以及直接设置吞吐量大小的-XX:GCTimeRatio。
  • 新生代复制算法、老年代标记-压缩
  • 参数控制:-XX:+UseParallelGC 使用Parallel收集器+ 老年代串行
Parallel Old 收集器
  • Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。这个收集器是在JDK 1.6中才开始提供
  • 参数控制: -XX:+UseParallelOldGC 使用Parallel收集器+ 老年代并行
CMS收集器
  • CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
  • 目前很大一部分的Java应用都集中在互联网站或B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。
  • 从名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于“标记-清除”算法实现的,它的运作过程相对于前面几种收集器来说要更复杂一些,整个过程分为4个步骤,包括:
    • 初始标记(CMS initial mark)

      并发标记(CMS concurrent mark)

      重新标记(CMS remark)

      并发清除(CMS concurrent sweep)

  • 其中初始标记、重新标记这两个步骤仍然需要“Stop The World”(STW)。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing的过程,而重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。
  • 由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发地执行。老年代收集器(新生代使用ParNew)
  • 优点:并发收集、低停顿
  • 缺点:产生大量空间碎片、并发阶段会降低吞吐量
  • .CMS收集器对CPU资源非常敏感。默认启动的回收线程数是(CPU+3)/4. 当CPU 4个以上时,并发回收垃圾收集线程不少于25%的CPU资源。
Serial Old收集器
  • Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器。给Client模式下的虚拟机使用。
  • 新生代采用复制算法,暂停所有用户线程;
  • 老年代采用标记-整理算法,暂停所有用户线程;
    G1收集器
  • 空间整合,G1收集器采用标记整理算法,不会产生内存空间碎片。分配大对象时不会因为无法找到连续空间而提前触发下一次GC。
  • 可预测停顿,这是G1的另一大优势,降低停顿时间是G1和CMS的共同关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为N毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒,这几乎已经是实时Java(RTSJ)的垃圾收集器的特征了。
  • 使用G1收集器时,Java堆的内存布局与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔阂了,它们都是一部分(可以不连续)Region的集合
  • G1将新生代,老年代的物理空间划分取消了。
  • 在java 8中,持久代也移动到了普通的堆内存空间中,改为元空间。
jdk8环境下,默认使用 Parallel Scavenge(新生代)+ Serial Old(老年代)
  • java -XX:+PrintCommandLineFlags -version

原文地址:https://www.cnblogs.com/frankltf/p/10359008.html

时间: 2024-11-08 19:27:14

GC原理---垃圾收集器的相关文章

GC算法 垃圾收集器

GC算法 垃圾收集器 参考:http://www.cnblogs.com/ityouknow/p/5614961.html 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分

java GC算法 垃圾收集器

GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的. 对象存活判断 判断对象是否存活一般有两种方式: 引用计数:每个

GC原理---垃圾收集算法

垃圾收集算法 Mark-Sweep(标记-清除算法) 标记清除算法分为两个阶段,标记阶段和清除阶段.标记阶段任务是标记出所有需要回收的对象,清除阶段就是清除被标记对象的空间. 优缺点:实现简单,容易产生内存碎片.因为会存在大量的空间碎片,因为回收后的空间是不连续的,这样给大对象分配内存的时候可能会提前触发full gc. 标记-压缩算法 首先也需要从根节点开始对所有可达对象做一次标记,但之后,它并不简单地清理未标记的对象,而是将所有的存活对象压缩到内存的一端.之后,清理边界外所有的空间.这种方法

JVM初探- 内存分配、GC原理与垃圾收集器

JVM初探- 内存分配.GC原理与垃圾收集器 标签 : JVM JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念上可简单认为new时分配外, 我们着重介绍后面的3个步骤: I. 怎样分配- JVM内存分配策略 对象内存主要分配在新生代Eden区, 如果启用了本地线程分配缓冲, 则优先在TLAB上分配, 少数情况能会直接分配在老年代, 或被拆分成标量类型在栈上分配(JIT优化). 分配的规则并不是百分百固定, 细节主要取

第三章 垃圾收集器与内存分配策略

书中笔记: 也许并不会死: 要宣告回收一个对象死亡,至少要经历两次标记过程: 当可达性分析发现一个对象不可达的时候,将标记第一次并进行筛选,筛选的条件是此对象是否有必要执行finalize()方法,当对象没有覆盖finalize或者已被调用过,则虚拟机认为此对象没必要执行finalize,  如果判断有必要执行,则此对象将会被放入一个F-Queue队列中,之后会被一个优先级比较低的Finalizer线程去调用,但是并不会等待他执行完毕,因为此对象的finalize并不可靠,可能会死循环之类的,如

HotSpot垃圾收集器GC的种类

堆内存的结构: 垃圾收集器就是垃圾收集算法的具体实现了.不同虚拟机所提供的垃圾收集器可能会有很大差别,我们使用的是HotSpot,HotSpot这个虚拟机所包含的所有收集器如图: 上图展示 了7种作用于不同分代的收集器,如果两个收集器之间存在连线,那说明它们可以搭配使用.虚拟机所处的区域说明它是属于新生代收集器还是老年代收集器.多说 一句,我们必须姚明带一个道理:没有最好的垃圾收集器,更加没有万能的收集器,只能选择对具体应用最合适的收集器.这也是HotSpot为什么要实现这么 多收集器的原因.O

垃圾收集器GC的种类

垃圾收集器就是垃圾收集算法的具体实现了.不同虚拟机所提供的垃圾收集器可能会有很大差别,我们使用的是HotSpot,HotSpot这个虚拟机所包含的所有收集器如图: 上图展示 了7种作用于不同分代的收集器,如果两个收集器之间存在连线,那说明它们可以搭配使用.虚拟机所处的区域说明它是属于新生代收集器还是老年代收集器.多说 一句,我们必须姚明带一个道理:没有最好的垃圾收集器,更加没有万能的收集器,只能选择对具体应用最合适的收集器.这也是HotSpot为什么要实现这么 多收集器的原因.OK,下面一个一个

JVM之垃圾收集器 (GC) 与内存分配策略

1.为什么要学习GC? GC (Garbage Collection)早于java出现,60年代出现的Lisp中最早使用了GC. 当需要排查各种内存溢出.内存漏斗问题时,当垃圾回收成为系统达到更高并发量的瓶颈时,就需要用到gc了. 总之,写出高性能的Java程序需要懂GC. 2.GC在JVM的体系结构中的位置 HotSpot JVM体系结构. 和应用性能相关的部分用紫色标出,调优从它们着手! 3.什么是性能? 在对Java应用程序进行调优时,主要关注两点:响应速度和吞吐量. 3.1响应速度 响应

Java虚拟机9:垃圾收集(GC)-4(垃圾收集器)

1.前言 垃圾收集器是前一章垃圾收集算法理论知识的具体实现了,不同虚拟机所提供的垃圾收集器可能会有很大差别,另外我们必须提前说明一个道理:没有最好的垃圾收集器,更加没有万能的收集器,只能选择对具体应用最合适的收集器.这也是HotSpot为什么要实现这么多收集器的原因,下面我们以HotSpot为例讲解.在写之前,先介绍几个概念. 1.1.并行和并发的区别 这个区别之前在你专门的一节介绍过,这里再重点提一下:这两个名词都是并发编程中的概念,在谈论垃圾收集器的上下文语境中,可以这么理解这两个名词: 1