前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM 垃圾收集器

JVM 垃圾收集器

作者头像
万能青年
发布2019-08-30 14:45:00
4090
发布2019-08-30 14:45:00
举报

一、什么是垃圾收集器

GC算法(引用计数/复制/标清/标整)是内存回收的方法论,垃圾收集器就是算法落地实现。

因为目前为止还没有完美的收集器出现,更加没有万能的收集器,知识针对具体应用最合适的收集器,进行分代收集。

二、4种主要垃圾收集器

串行垃圾回收器(Serial)

它为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有的用户线程。所以不适合服务器环境。

并行垃圾回收器(Parallel)

多个垃圾收集线程并行工作,此时用户线程是暂停的,适用于科学计算/大数据处理平台处理等弱交互场景。

并发垃圾回收器(CMS)

用户线程和垃圾收集线程同时执行(不一定是并行,可能交替执行),不需要停顿用户线程,使用对响应时间有要求的场景。

G1垃圾回收器

G1垃圾回收器将堆内存分割成不同的区域然后并发的对其进行垃圾回收。

三、怎样查看默认垃圾回收器

使用JVM参数:

java -XX:+PrintCommandLineFlags -version

四、配置回收器时,经常使用的参数

-XX:+UseSerialGC:在新生代和老年代使用串行收集器

-XX:+UseParNewGC:在新生代使用并行收集器

-XX:+UseParallelGC :新生代使用并行回收收集器,更加关注吞吐量

-XX:+UseParallelOldGC:老年代使用并行回收收集器

-XX:ParallelGCThreads:设置用于垃圾回收的线程数

-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器

-XX:ParallelCMSThreads:设定CMS的线程数量

-XX:+UseG1GC:启用G1垃圾回收器

五、如何选择垃圾收集器

组合的选择:

1.单CPU或小内存,单机程序

-XX:+UseSerialGC

2.多CPU,需要最大吞吐量,如后台计算型应用

-XX:+UseParallelGC 或

-XX:+UseParallelOldGC

3.多CPU,追求低停顿时间,需要快速响应如互联网应用

-XX:+UseConcMarkSweepGC

-XX:+PaeNewGC

4.选择一个垃圾收集器新生代和老年代的对应关系

六、G1垃圾收集器

1、是什么

G1(Garbage-First)收集器,是一款面向服务端应用的收集器,应用在多处理器和大容量内存环境中,在实现高吞吐量的同时,尽可能的满足垃圾收集暂停时间的要求。另外还具有一下特性:

  1. 像CMS收集器一样,能与应用程序线程并发执行。
  2. 整理空间空间更快
  3. 需要更多的时间来预测GC停顿时间
  4. 不希望牺牲大量的吞吐性能
  5. 不需要更大的Java Heap

2、G1收集器之前的收集器特点

  1. 年轻代和老年代是各自独立且连续的内存块
  2. 年轻代收集使用单eden+S0+s进行复制算法
  3. 老年代收集必须扫描整个老年代区域
  4. 都是以尽可能少而快速地执行GC为设计原则。

3、底层原理

Region区域化垃圾收集器:

区域化内存划片Region,整体编为一系列不连续的内存区域,避免了全内存的GC操作。

核心思想是将整个堆内存区域分成大小相同的子区域(Region),在JVM启动时会自动设置这些子区域的大小。

在堆的使用上,G1并不要求对象的存储一定是物理上连续的只要逻辑上连续即可,每个分区也不会固定地为某个代服务,可以按需在年轻代和老年代之间切换。启动时可以通过参数-XX:G1HeapRegionSize=n可指定分区大小(1MB-32MB,且必须是2的幂),默认将整个堆划分为2048个分区。

大小范围在1MB-32MB,最多能设置2048个区域。也即能够支持的最大内存为:32MB*2048=65536MB=64G内存。

G1将新生代、老年代的物理空间取消了。

G1算法将堆划分为若干个区域(Region),它仍然属于分代收集器

这些Region的一部分包含新生代,新生代的垃圾收集依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者Survivor空间。

这些Region的一部分包含老年代,G1收集器通过将对象从一个区域复制到另一个区域,完成了清理工作。这就意味着,在正常的处理过程中,G1完成了堆的压缩(至少是部分堆的压缩),这样也就不会有CMS内存碎片问题的存在了。

在G1中,还有一种特殊的区域,叫Humongous(巨大的)区域。如果一个对象占用的空间超过了分区容量的50%以上,G1收集器就认为这是一个巨型对象。这些巨型对象默认直接会被分配在老年代,但是如果它是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响。为了解决这个问题,G1划分了一个Humongous区,它用来专门存放巨型对象。如果一个H区装不下一个巨型对象,那么G1会寻找连续的H分区来存储。为了能找到连续的H区,有时候不得不启动Full GC。

回收步骤:

G1收集器下的Young GC

针对Eden区进行收集,Eden区耗尽后会被触发,主要是小区域收集+形成连续的内存块,避免内存碎片。

  1. Eden区的数据移动到新的Survivor区,部分数据晋升到Old区。
  2. Survivor区的数据移动到新的Survivor区,部分数据晋升到Old区。
  3. 最后Eden区收集干净了,GC结束,用户的应用程序继续执行。

四个过程:

初始标记:只标记GC Roots能直接关联到的对象

并发标记:进行GC Roots Tracing的过程

最终标记:修正并发标记期间,因程序运行导致标记发生变化的那一部分对象

筛选回收:根据时间来进行价值最大化的回收。

4、配置参数

开发人员仅仅声明一下参数即可:

三步归纳:开始G1+设置最大内存+设置最大停顿时间

  • -XX:+UseG1GC
  • -Xmx32g
  • -XX:MaxGCPauseMillis=100

-XX:MaxGCPauseMillis=n:最大GC停顿时间单位毫秒,这是个软目标,JVM将尽可能(但不保证)停顿小于这个时间。

5、和CMS相比的优势

  1. G1不会产生内存碎片
  2. 是可以精确控制停顿。该收集器是把整个堆(新生代、老生代)划分成多个固定大小的区域,每次根据允许停顿时间去手机垃圾最多的区域。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaArtisan 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 串行垃圾回收器(Serial)
  • 并行垃圾回收器(Parallel)
  • 并发垃圾回收器(CMS)
  • G1垃圾回收器
  • 1、是什么
  • 2、G1收集器之前的收集器特点
  • 3、底层原理
    • Region区域化垃圾收集器:
      • 回收步骤:
        • 四个过程:
        • 4、配置参数
        • 5、和CMS相比的优势
        相关产品与服务
        大数据处理套件 TBDS
        腾讯大数据处理套件(Tencent Big Data Suite,TBDS)依托腾讯多年海量数据处理经验,基于云原生技术和泛 Hadoop 生态开源技术对外提供的可靠、安全、易用的大数据处理平台。 TBDS可在公有云、私有云、非云化环境,根据不同数据处理需求组合合适的存算分析组件,包括 Hive、Spark、HBase、Flink、presto、Iceberg、Alluxio 等,以快速构建企业级数据湖、数据仓库。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档