1.概述

转载:http://anyteam.me/garbage-collection-algorithms-parallel-gc/
建议看原文。

这个组合的垃圾收集器使用标记-复制的方式清理年轻代,使用标记-清除-整理的方式清理老年代。它们都会触发Stop-the-world暂停,挂起应用的全部线程。它们都会使用多线程来运行标记和复制/整理,这也是Parallel GC名字的由来。使用这种方法,垃圾收集的次数会明显减少很多。

垃圾收集时使用的线程数可以通过参数-XX:ParallelGCThreads=NNN设置,默认值为系统硬件的 CPU 核心数。

要使用Parallel GC,可以选择下面三种方式之一来启动 JVM。

java -XX:+UseParallelGC com.mypackages.MyExecutableClass
java -XX:+UseParallelOldGC com.mypackages.MyExecutableClass
java -XX:+UseParallelGC -XX:+UseParallelOldGC com.mypackages.MyExecutableClass

在多核 CPU 环境下,如果你得首要目的是增加系统吞吐量,那么Parallel GC非常合适。更高的吞吐量是由更高效的资源利用率带来的:

  • 垃圾收集时,所有的 CPU 核心并行做垃圾清理,带来了更短的暂停时间;
  • 在垃圾收集事件之间,收集器不占用任何资源。

另一方面,因为垃圾收集的所有阶段都不能被打断,Parallel GC还是有可能导致长时间的应用暂停。因此,如果低延时是你的首要目标,那么你应该去看看CMS 垃圾收集算法。

让我们来看看使用Parallel GC时,垃圾收集日志长什么样,我们能从中得到哪些信息。下面的日志包含了 2 次垃圾收集事件:Minor GC和Full GC。

2015-05-26T14:27:40.915-0200: 116.115: [GC (Allocation Failure) [PSYoungGen: 2694440K->1305132K(2796544K)] 9556775K->8438926K(11185152K), 0.2406675 secs] [Times: user=1.77 sys=0.01, real=0.24 secs]
2015-05-26T14:27:41.155-0200: 116.356: [Full GC (Ergonomics) [PSYoungGen: 1305132K->0K(2796544K)] [ParOldGen: 7133794K->6597672K(8388608K)] 8438926K->6597672K(11185152K), [Metaspace: 6745K->6745K(1056768K)], 0.9158801 secs] [Times: user=4.49 sys=0.64, real=0.92 secs]

Minor GC

下面是第一段日志片段,包含了清理年轻代的垃圾收集事件信息:

2015-05-26T14:27:40.915-0200 : 116.115 : [GC (Allocation Failure) [PSYoungGen : 2694440K->1305132K (2796544K) ] 9556775K->8438926K (11185152K), 0.2406675 secs] [Times: user=1.77 sys=0.01, real=0.24 secs]
2015-05-26T14:27:40.915-0200 – GC 开始时间。
116.115 – GC 开始时间,相对于 JVM 的启动时间的偏移,单位秒。
GC – 标志位:Minor GC或Full GC。本次为Minor GC。
Allocation Failure – 触发垃圾收集的原因。本次为年轻代空间不足以分配新对象。
PSYoungGen – 使用的垃圾收集器名称,代表使用的是并行标记-复制且Stop-the-world的垃圾收集器清理年轻代。
2694440K->1305132K – 垃圾收集前后年轻代空间使用量。
(2796544K) – 年轻代空间大小。
9556775K->8438926K – 垃圾收集前后堆上空间使用量。
(11185152K) – 堆大小。
0.2406675 secs – 垃圾收集时长,单位秒。
[Times: user=1.77 sys=0.01, real=0.24 secs] – 分类统计的垃圾收集时长:
user:垃圾收集中的线程占用的 CPU 总时间
sys:系统调用和等待系统事件占用的 CPU 时间
real:应用暂停时长。使用Paralled GC时,real≈(user+sys) / countOfThreadsUsedInGC,本次 GC 中使用了 8 个线程。要注意,GC 中总有一些操作是不能并行执行的,因此,实际的real值一般会比计算出来的值大一些。

总之,垃圾收集之前堆的使用量为 9,556,775K,其中年轻代使用量为 2,694,440K,那么可算出老年代使用量为 6,862,335K。垃圾收集之后,年轻代使用量下降了 1,389,308K,但堆的使用量只下降了 1,117,849K,意味着有 271,459K的对象从年轻代提升到了老年代。

Full GC

了解了上面清理年轻代的垃圾收集日志,下面通过分析第二段日志看看整个堆是怎么被清理的。

2015-05-26T14:27:41.155-0200 : 116.356 : [Full GC (Ergonomics) [PSYoungGen: 1305132K->0K(2796544K)] [ParOldGen : 7133794K->6597672K (8388608K)] 8438926K->6597672K (11185152K), [Metaspace: 6745K->6745K(1056768K)], 0.9158801 secs, [Times: user=4.49 sys=0.64, real=0.92 secs]
2015-05-26T14:27:41.155-0200 – GC 开始时间。
116.356 – GC 开始时间,相对于 JVM 的启动时间的偏移,单位秒。
Full GC – 标志位:Minor GC或Full GC。本次为清理年轻代和老年代的Full GC。
Ergonomics – GC 发生的原因。Ergonomics表明 JVM 觉得是时候做些垃圾清理工作了。
[PSYoungGen: 1305132K->0K(2796544K)] – 跟上面的例子类似,它是一个叫PSYoungGen的并发标记-复制且Stop-the-world的垃圾收集器。年轻代的使用量降到了 0,这也是Full GC的一般结果。
ParOldGen – 清理老年代的垃圾收集器类型。这是一个叫ParOldGen的并行标记-清除-整理且Stop-the-world的垃圾收集器。
7133794K->6597672K – 垃圾收集前后老年代使用量。
(8388608K) – 老年代空间大小。
8438926K->6597672K – 垃圾收集前后堆上空间使用量。
(11185152K) – 堆大小。
[Metaspace: 6745K->6745K(1056768K)] – 垃圾收集前后元数据区使用量。这里没有变化。
0.9158801 secs – 垃圾收集时长,单位秒。
[Times: user=4.49 sys=0.64, real=0.92 secs] – 分类统计的垃圾收集时长:
user:垃圾收集中的线程占用的 CPU 总时间
sys:系统调用和等待系统事件占用的 CPU 时间
real:应用暂停时长。使用Paralled GC时,real≈(user+sys) / countOfThreadsUsedInGC,本次 GC 中使用了 8 个线程。要注意,GC 中总有一些操作是不能并行执行的,因此,实际的real值一般会比计算出来的值大一些。
Full GC跟Minor GC的区别很明显 – 除了年轻代,老年代和元数据区同样被清理了。下图示意了Full GC前后内存使用情况。

【java】java Parallel GC 该怎么看?相关推荐

  1. 聊聊Java的GC机制,看了都说好~

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 Past is a nice place to visit, but ce ...

  2. Java内存组成GC算法

    Java内存组成&GC算法 @(JAVA)[java] Java内存组成GC算法 一内存组成 一Java程序的内存组成 1Java堆 2方法区含常量池永久代 3栈 1Java虚拟机栈 2本地方 ...

  3. Java 12 Shenandoah GC

    阅读本文前,希望可以先了解一下G1.ZGC,以便有所比较,从而能更好的理解Shenandoah_GC. Java G1:https://blog.csdn.net/jiankunking/articl ...

  4. java 避免gc_Java GC机制

    Java GC机制是JVM中一个最重要的部分,了解GC机制也对了解JVM中内存分布,日志查看等原理有所了解 存储划分 垃圾回收算法 1.引用计数(Reference Counting) 2.标记清除( ...

  5. JAVA之JVM GC 机制与性能优化

    1 背景介绍 与C/C++相比,JAVA并不要求我们去人为编写代码进行内存回收和垃圾清理.JAVA提供了垃圾回收器(garbage collector)来自动检测对象的作用域),可自动把不再被使用的存 ...

  6. Java程序员总结出必看的初级~高级技术面试题

    1换位思考下,如果你面试官,你会怎么做 1只能通过简历和面试来衡量,别无他法.如果某位大牛确认能力很行,但面试时无法充分地自证能力,那对不起了,过不了,现实就这样. 2如果面试官由于能力不行,招进来一 ...

  7. java.lang.OutOfMemoryError: GC overhead limit exceeded

    今天现场weblogic报java.lang.OutOfMemoryError: GC overhead limit exceeded,在metalink查了下,有明白解释,要设置一个JVM參数.只是 ...

  8. Idea运行项目报错:java.lang.OutOfMemoryError: Java heap space/ java.lang.OutOfMemoryError: GC overhead 解决方法

    问题 使用Idea运行代码量比较多的项目时,会报错:java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: GC ...

  9. java常见的gc回收器_一篇文章让你了解GC垃圾回收器

    简单了解GC垃圾回收器 了解GC之前我们首先要了解GC是要做什么的?顾名思义回收垃圾,什么是垃圾呢? GC回收的垃圾主要指的是回收堆内存中的垃圾对象. 从根对象出发,所有被引用的对象,都是存活对象 其 ...

最新文章

  1. 人工智能芯片支持超低功耗器件的推理
  2. B/S,C/S简单介绍
  3. 进程间的通信方式(二):管道Pipe和命令管道FIFO
  4. ImportError: libcublas.so.10.0: cannot open shared object file: No such file or directory
  5. BGP:全穿透,半穿透,静态代播有什么区别
  6. 简单工厂模式,工厂方法模式,抽象工厂模式,spring的狂想
  7. C++中const、volatile、mutable的用法
  8. Wodpress模板
  9. 台积电一季度营收接近170亿美元 再创新高
  10. 2018年慈溪职高计算机实验班2019,包场高级中学(创新实验班)2019年中考录取分数线...
  11. leetcode同样的代码 网上结果和本地结果不一样_Leetcode #263
  12. IBM AIX存储层结构及操作命令实现
  13. 字符串的迷之算法——KMP,AC自动机,后缀数组
  14. php 调用speex解码库,怎么增加speex解码库
  15. 来,让我用Python给你算一命
  16. php getcwd文件件,PHP目录函数 getcwd (取得当前工作目录)
  17. 错误:Attempted read from closed stream尝试读取关闭的流!!!
  18. 数据库大数据量、高并发、高可用解决方案!
  19. 2019第十届蓝桥杯JAVA B组题目分析
  20. 普通代码块,静态代码块,构造代码块,构造方法

热门文章

  1. 生产线改造升级 蔚来部分10月份车辆订单将推迟交付
  2. 蔚来三元铁锂电池绕道超车
  3. Apple Watch移动心电图ECG与房颤提示功能获药监局审核
  4. 撒贝宁探班威马体验百度Apollo L4级自动驾驶 感慨:确实震撼
  5. 经济学家建议茅台国外售价为国内2倍:未来最有可能走向世界的奢侈品牌
  6. 拼多多:不搞套路,要实现同品全网最低价直售
  7. 期待已久!iPhone 13将使用带LTPO技术的OLED屏幕
  8. 奔驰又召回了!“方便进出”功能翻车
  9. 卢伟冰正式预告Redmi K30:首发双开孔全面屏+双模5G
  10. 5G远程驾驶亮相进博会 网友:以后考个远程驾照?