文档章节

垃圾收集器

o
 osc_a22drz29
发布于 2019/03/21 11:09
字数 2370
阅读 0
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

GC概念

  如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。

  GC(Garbage Collection)的工作任务可以分为两类:内存的动态分配和垃圾回收。在内存执行分配之前,GC会先对内存进行划分区域,在上一篇博客中我们知道Java虚拟机使用了分代收集算法,所以堆区里面会被分为新生代和老年代两个区域,新生代又分为Eden空间、From空间和To空间。 空间划分完成后,GC就可以为新对象分配内存空间。

  在JDK版本这么多年发展的途中,垃圾收集器也已经出现了多种版本,基于分代的概念,不同的分代空间中活动着不同的GC。

  从不同的角度分析垃圾收集器,可以将GC分为不同的类型。

按照线程数分,可分为串行垃圾回收器和并行垃圾回收器。
按照工作模式分,可分为并发式垃圾回收器和独占式垃圾回收器。
按碎片处理方式分,可分为压缩式垃圾回收器和非压缩式垃圾回收器。
按工作内存分,可分为新生代垃圾回收器和老年代垃圾回收器。

下面简单介绍这几个概念

并发式回收器和独占式回收器

  并发式垃圾回收器与应用程序线程交替工作,以尽量减少程序的停顿时间。

  独占式回收器(Stop the world)一旦运行,就会停止应用程序中的其他所有线程,直到垃圾回收完全结束。

串行回收器和并行回收器

  串行回收器是所有垃圾回收器中最古老的的一种,也是JDK中最基本的垃圾回收器之一,他的主要特点是使用单线程进行垃圾回收,其次,他是独占式的回收机制。

  串行回收是指在同一时间段内只允许一件事情发生,也就是说,当多个CPU可用时,也只能由一个CPU用于执行垃圾回收操作,并且在执行垃圾回收期间,其他的工作线程将被暂停,当垃圾回收完全结束之后才会恢复之前被暂停的工作线程。

  并行回收器是工作在新生代的垃圾收集器,它只是简单的将串行回收器多线程化,本质上和串行回收器一模一样。

  并行回收器也是独占式,在回收过程中,应用程序的线程会全部暂停,但是由于并行回收器使用多线程进行垃圾回收,在并发能力比较强的CPU上,它产生的停顿时间要短于串行回收器,而在单CPU系统中,并行回收器的效果不会比串行回收器好。

压缩式回收器和非压缩式回收器

  压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后导致的内存空间碎片。

  没有整理空间碎片的步骤就叫非压缩回收器。

Serial 收集器

  Serial收集器是历史最悠久的收集器,在早期的JKD版本中,Serial收集器是新生代唯一的选择。

  它是串行的,也是独占式的,这是它的缺点,但如果限定于单个CPU的环境来说,Serial收集器由于没有线程交互的开销,自然可以获得最高的单线程收集效率。

  注意:Serial收集器虽然古老,但是久经考验,在大多数情况下,性能表现是相当不错的,采用复制算法。

  同时,老年代中也有Serial收集器,叫做Serial Old收集器。

ParNew 收集器

  ParNew收集器是一个工作在新生代的垃圾收集器,其实说白了就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集之外,其他与Serial收集器相比并没有什么创新之处。

  ParNew收集器也是独占式,在收集过程中,应用程序的线程会全部暂停,但是由于并行收集器使用多线程进行垃圾回收,在并发能力比较强的CPU上,它产生的停顿时间要短于Serial收集器的。

  如果说ParNew收集器运行在多CPU的环境下,确实可以更快的完成垃圾收集。但是如果是在单个CPU的环境下,ParNew收集器是不如Serial高效的。

   ParNew收集器只存在于新生代中。

Parallel 收集器

  Parallel收集器除了和ParNew收集器一样是基于并行回收以外,Parallel也同样的使用了复制算法和独占式机制。

  但是不同的是,Parallel收集器的关注点不同,它的关注点是系统的吞吐量,也被称作"吞吐量优先"的收集器。吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)

  需要注意的是,垃圾收集器中吞吐量和线程停顿时间是互相矛盾的,GC停顿时间缩短必须要牺牲吞吐量和新生代空间来换取,比如,系统把新生代调小一点,收集300M新生代肯定比收集500M新生代速度快,这也直接导致垃圾收集发生的更频繁,原来10秒收集一次,每次停顿100秒,现在变成5秒收集一次,每次停顿70秒,停顿时间下降了,但吞吐量也下降了。

  同样的,老年代中也存在Parallel收集器,叫做Parallel Old收集器。

CMS 收集器

  CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,它是一款优秀的老年代垃圾收集器。

  从名字可以看出,CMS为并发而生,并且使用的是标记清除算法。它的执行过程分为四个阶段:初始标记、并发标记、重新标记、并发清除。

  初始标记是独占式,但它速度很快,仅仅只是标记GC Roots所能关联到的对象,并发标记会将之前的不可达的所有对象标记为垃圾,由于在并发标记阶段有可能有些标记过的对象引用发生变动,为了解决这个问题,CMS会进入到重新标记阶段,经历过这三个阶段后,CMS最终进入到并发清除阶段执行内存回收。

  尽管CMS收集器采用的是并行回收,但是在初始标记阶段和重新标记阶段都使用的是独占式机制,需要暂停程序中的所有线程,可以说明目前所有的垃圾收集器都做不到完全不需要独占式机制,只是尽可能的缩短暂停时间而已。

  注意:CMS使用的算法是标记清除,因此清除垃圾后,会残留大量空间碎片。为了解决这个问题,MCS收集器会默认清除垃圾后进行碎片整理,也因此停顿时间不得不增长。

G1 收集器

  G1(Garbage-First)收集器是当今收集器技术发展最前沿的成果之一,它解决了前三个收集器的很多缺陷。

  作为CMS的长期替代方案,G1使用了分代分区算法,特点如下:

1.并行性:G1在回收期间,可以由多个GC线程同时工作,有效利用多核计算能力。
2.并发性:G1拥有与应用程序交替执行的能力,部分工作可以和应用程序同时执行,因此一般来说,不会再整个回收期间完全阻塞应用程序。
3.分代收集:G1和之前的回收器不同,它兼顾新生代和老年代,可以独立管理整个GC堆,能够采用不同的方式去管理新生代和老年代的对象。
4.空间整理:G1是基于标记压缩算法实现的收集器,在每次回收后都会有效的整理空间。
5.可预见性:由于分区的原因,G1可以只选取部分区域进行内存回收,这样缩小了回收范围,对于应用线程停顿可以有很好的控制。

一切细节问题

System.gc()

  在默认情况下,System.gc()会显示的触发Full GC,同时对老年代和新生代进行回收,一般情况下,垃圾回收应该是自动进行,不需要手动触发,如果过于频繁的触发垃圾回收对系统性能是没有好处的。

对象进入老年代

  一般情况下,对象首次创建时,会被放置在新生代eden区,如果没有GC的介入,这些对象不会离开eden。

  两种情况下对象会进入老年代,第一种是对象经历的GC次数达到一定的值,默认为15次,就会进入老年代。第二种情况是对象的体积过大,也非常有可能会直接进入老年代。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
java虚拟机垃圾收集器汇总

1:新生代 (1)Serial(单线程,复制算法) (2)ParNew(serial+多线程) (3)ParallelScavenge(多线程复制算法,高效) 2:老年代 (1)Serial Old(单线程标记整理算法) (2)Parallel Old(多线程标记...

谭仕军
2019/05/27
0
0
JVM第二弹

JVM第二弹 GC分代收集算法VS分区收集算法 分代收集算法 当前主流的VM垃圾收集都采用“分代收集“算法,这种算法会根据对象存活周期的不同将内存划分为几块,如JVM中的新生代、老年代、永久代...

趣学程序
02/04
18
0
持续3分钟 - Java -06

↑↑↑点上方蓝色小字,关注「iBroPro」 置顶星标「iBroPro」,及时接收新消息 GC 垃圾收集器 Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收年老代主要使...

子乾建建_Jeff
01/09
0
0
Java虚拟机详解(四)------垃圾收集器

  上一篇博客我们介绍了Java虚拟机垃圾回收,介绍了几种常用的垃圾回收算法,包括标记-清除,标记整理,复制等,这些算法我们可以看做是内存回收的理论方法,那么在Java虚拟机中,由谁来具...

osc_i6ddt53t
04/16
2
0
Java常用的垃圾收集器

在上一篇文章中,我们介绍了Java的垃圾回收机制,包括什么时候回收垃圾,标记垃圾的算法以及回收垃圾的算法。这篇文章我们主要来介绍Java的垃圾收集器。 在介绍垃圾收集器之前,我们首先需要...

osc_tr9tcucx
2019/06/17
2
0

没有更多内容

加载失败,请刷新页面

加载更多

263. Ugly Number

题目: 263. Ugly Number 题目地址:https://leetcode.com/problems/ugly-number/ Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers......

JiaMing
22分钟前
34
0
HCIA_ARP01

ARP(地址解析协议) eNSP 常用路由器:AR2220 常用交换机:S5700、S3700 常用终端:PC、MCS(主播服务器) 设备连线:Copper(以太网用到的双绞线)、Serial(串口线,2SA接口)、Auto(自动连...

创业789
25分钟前
13
0
如何在Rails 4中使用问题 - How to use concerns in Rails 4

问题: The default Rails 4 project generator now creates the directory "concerns" under controllers and models. 默认的Rails 4项目生成器现在在控制器和模型下创建目录“Concer”。 ......

fyin1314
29分钟前
19
0
【LeetCode】 57 括号生成

题目: 解题思路: https://leetcode-cn.com/problems/generate-parentheses/solution/hui-su-suan-fa-by-liweiwei1419/ 代码: import java.util.ArrayList;import java.util.List;publ......

JaneRoad
昨天
8
0
度小满上线“推有钱”贷款推广平台,合伙人直推佣金为贷款金额的2.5%

来源 | 镭射财经 作者 | 黄老邪 2020年,蓬勃发展的消金行业受到新冠肺炎疫情的冲击,用户增长放缓、逾期率上升成为共性问题。但疫情或许只是导火索,对于消金行业来说,用户增长红利的消退,...

镭射财经
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部