专栏首页Java学习录JVM垃圾收集器详解

JVM垃圾收集器详解

本文涉及:JVM中各垃圾收集器的介绍及常用参数、JVM的两种模式

串行收集器

Serial 垃圾收集器

一个单线程的收集器,使用复制算法。它只会使用一条线程工作,并且在进行垃圾收集的同时,必须暂停其他所有的工作线程(Stop The Word),直到垃圾收集结束。

虽然在收集垃圾过程中需要暂停所有其他的工作线程,但是对于单个 CPU 环境来说,没有线程交互的开销,可以获得最高的单线程垃圾收集效率

Serial Old 收集器

Serial 垃圾收集器老年代版本,它同样是个单线程的收集器,使用标记-整理算法

相关参数

  • -XX:+UseSerialGC:在新生代和老年代使用的串行收集器
  • -XX:SurvivorRatio:设置eden区大小和survivor区大小的比例
  • -XX:PretenureSizeThreshold:设置大对象直接进入老年代的阀值,当对象的大小超过这个值时,将直接在老年代分配
  • -XX:MaxTenuringThreshold:设置对象进入老年代的年龄的最大值,每一次MinorGC后,对象年龄就加1,任何大于这个年龄的对象,一定会进入老年代

并行收集器

ParNew 垃圾收集器

Serial 收集器的多线程版本,也使用复制算法,除了使用多线程进行垃圾收集之外,其余的行为和 Serial 收集器完全一样,在垃圾收集过程中同样也要暂停所有其他的工作线程。

默认开启和 CPU 数目相同的线程数

Parallel Scavenge 收集器

新生代垃圾收集器,同样使用复制算法,也是一个多线程的垃圾收集器,它重点关注的是程序达到一个可控制的吞吐量(运行用户代码时间/(运行用户代码时间+垃圾收集时间)),高吞吐量可以最高效率地利用 CPU 时间,尽快地完成程序的运算任务,主要适用于在后台运算而不需要太多交互的任务。自适应调节策略也是 ParallelScavenge 收集器与 ParNew 收集器的一个重要区别

Parallel Old 收集器

Parallel Scavenge的老年代版本,使用多线程的标记-整理算法

相关参数

  • -XX:+UseParNewGC:在新年代使用并行收集器
  • -XX:+UseParallelOldGC:在老年代使用并行收集器
  • -XX:ParallelGCThreads:设置用于垃圾回收的线程数。通常情况下可以和CPU数量相等,但在CPU数量比较多的情况下,设置相对较小的数值也是合理的。
  • -XX:MaxGCPauseMillis:设置吞吐量大小,它的值是一个大于0的整数,收集器在工作时,会调整Java堆大小或者其他一些参数,尽可能地把停顿时间控制在MaxGCPauseMillis以内。
  • -XX:GCTimeRatio:设置吞吐量大小,它的值是一个0到100之间的整数,假设GCTimeRatio的值为n,那么系统将花费不超过1/(1+n)的时间用于垃圾回收
  • -XX:+UseAdaptiveSizePolicy:打开自适应GC策略,在这种模式下,新生代的大小、eden和survivior的比例、晋升老年代的对象年龄等参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。

并发收集器

CMS 收集器

这个收集器的目标是为了获取最短垃圾回收停顿时间,它使用多线程的标记-清除算法

CMS 工作机制

  • 初始标记,只标记跟节点能直接关联的对象
  • 并发标记,进行根节点跟踪的过程
  • 重新标记,为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录
  • 并发清除,清除根节点不可达对象
  • 由于耗时最长的并发标记和并发清除过程中,垃圾收集线程可以和用户现在一起并发工作,所以总体上来看CMS 收集器的内存回收和用户线程是一起并发地执行

相关参数

  • -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
  • -XX:ParallelCMSThreads:设定CMS的线程数量
  • -XX:CMSInitiationgOccupancyFraction:设置CMS收集器在老年代空间被占用多少后触发,默认为68%
  • -XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
  • -XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
  • -XX:+CMSClassUnloadingEnabled:允许对永久区进行回收
  • -XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收(前提是-XX:+CMSClassUnloadingEnabled激活了)
  • -XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候才进行CMS回收
  • -XX:+CMSIncrementalMode:使用增量模式,比较适合单CPU

G1 收集器

目前垃圾收集器理论发展的最前沿成果,相比与 CMS 收集器,G1 收集器两个最突出的改进是:

  • 基于标记-压缩算法,不产生内存碎片
  • 可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收

相关参数

  • -XX:+UseG1GC:使用G1回收器
  • -XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间
  • -XX:GCPauseIntervalMillis:设置停顿间隔时间

JVM启动的两种模式

  • client模式:开发时默认启动模式
  • server模式:使用-server强制开启server模式,

两者的主要区别:

  • server模式下做了大量的优化工作。
  • server模式下应用启动较慢,但在长时间运行情况下,运行速度会越来越快。
  • client模式启动快,但不适合长时间运行。

本文分享自微信公众号 - Java学习录(Javaxuexilu),作者:Java学习录

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux常用命令速查-文件管理

    Linux系统中的每个文件和目录都有访问许可权限,用他来确定谁能通过何种方式对文件和目录进行访问和操作。

    Java学习录
  • 使用索引的注意事项

    Java学习录
  • 一波骚操作,我把 SQL 执行效率提高了 10,000,000 倍

    发现没有用到索引,type全是ALL,那么首先想到的就是建立一个索引,建立索引的字段当然是在where条件的字段。

    Java学习录
  • 超长JVM总结,面试必备

    JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,...

    java金融
  • 5种JVM垃圾收集器特点和8种JVM内存溢出原因

    Serial 是一款用于新生代的单线程收集器,采用复制算法进行垃圾收集。Serial 进行垃圾收集时,不仅只用一条线程执行垃圾收集工作,它在收集的同时,所有的用...

    程序员追风
  • JVM面试问题系列:7种JVM垃圾收集器特点,优劣势、及使用场景!

    Serial 是一款用于新生代的单线程收集器,采用复制算法进行垃圾收集。Serial 进行垃圾收集时,不仅只用一条线程执行垃圾收集工作,它在收集的同时,所有的用...

    zhisheng
  • JVM性能调优-ParNew收集器内容精讲

    ParNew 收集器其实就是 Serial 收集器的多线程版本,除了使⽤多条线程进⾏垃圾收集之外,其余⾏为包括 Serial 收集器可⽤的所有控制参数(例如:-...

    cwl_java
  • 一张图看懂JVM之垃圾回收器详解

    感谢读者的反馈,在?图中更新了新生代Eden区以及两个Survivor区的默认空间占比的分配表示,这里按照10等份区分8/10、1/10、1/10分别表示8:1...

    用户5927304
  • JVM第二弹

    当前主流的VM垃圾收集都采用“分代收集“算法,这种算法会根据对象存活周期的不同将内存划分为几块,

    趣学程序-shaofeer
  • 面试官,不要再问我“Java 垃圾收集器”了

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    用户1161110

扫码关注云+社区

领取腾讯云代金券