打印日志

  通过加入 -XX:+PrintGCDetails 参数则可以打印详细GC信息至控制台。参数-verbose:gc也是可以,但不够详细。通过加入-XX:+PrintGCDateStamps则可以记录GC发生的详细时间。通过加入 -Xloggc:/home/XX/gc/app_gc.log。可以把GC输出至文件,这对长时间服务器GC监控很有帮助。通过加入-XX:+DisableExplicitGC可以将System.gc()转为空操作。

日志分析

ParNew

  通过加入-XX:+UseParNewGC参数指定新生代使用ParNew垃圾收集器。

2017-12-19T15:45:31.518-0800: 0.218: [GC (Allocation Failure) 2017-12-19T15:45:31.518-0800: 0.218: [ParNew: 31031K->4351K(39296K), 0.2660674 secs] 31031K->22453K(126720K), 0.2661635 secs] [Times: user=0.59 sys=0.05, real=0.27 secs] 

  2017-12-19T15:45:31.518-0800 GC发生的时间。 Allocation Failure表示gc的原因;ParNew表示是ParNew新手代收集器;31031K表示GC前的年轻代大小; 4351K表示GC后的年轻代大小;39296K年轻代的总大小。0.2660674本次回收的时间。

Parallel Scavenge

2017-12-18T20:54:09.544-0800: 2.988: [GC (Allocation Failure) [PSYoungGen: 33280K->400K(38400K)] 33280K->408K(125952K), 0.0008640 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

  2017-12-18T20:54:09.544-0800 GC发生的时间。Allocation Failure表示gc的原因;PSYoungGen 表示是Parallel Scavenge新时代收集器;33280K 表示GC前的年轻代大小; 400K表示GC后的年轻代大小;38400K年轻代的总大小。33280K表示GC前的堆大小;408K表示GC后的堆大小;125952K表示堆的总大小0.0008640本次回收的时间。Times: user=0.00 sys=0.00, real=0.00 secs,表示内核执行用户时间,系统调用时间,和总时间。

CMS

  通过加入-XX:+UseConcMarkSweepGC参数指定老年代使用CMS垃圾收集器。

2017-12-19T16:08:32.961-0800: 11.052: [GC (CMS Initial Mark) [1 CMS-initial-mark: 26710K(87424K)] 28716K(126720K), 0.0017267 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2017-12-19T16:08:32.962-0800: 11.054: [CMS-concurrent-mark-start]
2017-12-19T16:08:33.041-0800: 11.133: [CMS-concurrent-mark: 0.079/0.079 secs] [Times: user=0.06 sys=0.01, real=0.08 secs]
2017-12-19T16:08:33.041-0800: 11.133: [CMS-concurrent-preclean-start]
2017-12-19T16:08:33.043-0800: 11.134: [CMS-concurrent-preclean: 0.002/0.002 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2017-12-19T16:08:33.043-0800: 11.134: [CMS-concurrent-abortable-preclean-start]
2017-12-19T16:08:33.555-0800: 11.647: [CMS-concurrent-abortable-preclean: 0.075/0.512 secs] [Times: user=0.15 sys=0.01, real=0.51 secs]
2017-12-19T16:08:33.555-0800: 11.647: [GC (CMS Final Remark) [YG occupancy: 1939 K (39296 K)]2017-12-19T16:08:33.555-0800: 11.647: [Rescan (parallel) , 0.0038080 secs]2017-12-19T16:08:33.559-0800: 11.651: [weak refs processing, 0.0000223 secs]2017-12-19T16:08:33.559-0800: 11.651: [class unloading, 0.0002446 secs]2017-12-19T16:08:33.560-0800: 11.651: [scrub symbol table, 0.0004310 secs]2017-12-19T16:08:33.560-0800: 11.651: [scrub string table, 0.0001471 secs][1 CMS-remark: 32503K(87424K)] 34443K(126720K), 0.0047693 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
2017-12-19T16:08:33.560-0800: 11.652: [CMS-concurrent-sweep-start]
2017-12-19T16:08:33.572-0800: 11.663: [CMS-concurrent-sweep: 0.011/0.011 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
2017-12-19T16:08:33.572-0800: 11.663: [CMS-concurrent-reset-start]
2017-12-19T16:08:33.576-0800: 11.668: [CMS-concurrent-reset: 0.004/0.004 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]

1.第一阶段 初始标记

  2017-12-19T16:08:32.961-0800: 11.052 CMS Initial Mark的开始时间。CMS Initial Mark:收集阶段,开始收集所有的GC Roots和直接引用到的对象;26710K当前老年代的使用容量;87424K老年代的总容量;28716K当前堆的使用容量;126720K当前堆的总容量;0.0017267 secs执行时间。

2.第二阶段 并发标记

  这个阶段会遍历整个老年代并且标记所有存活的对象,并发标记的特点是和应用程序线程同时运行。

  2017-12-19T16:08:32.962-0800: 11.054并发标记时间;CMS-concurrent-mark-start并发标记开始;CMS-concurrent-mark: 0.079/0.079 secs并发标记执行时间;

3.第三阶段 并发重新标记

  前一个阶段在并行运行的时候,一些对象的引用已经发生了变化,在这个阶段,那些能够对那些对象到达的对象标记。

  2017-12-19T16:08:33.041-0800: 11.133 并发重新标记时间; CMS-concurrent-preclean-start并发重新标记开始标志; CMS-concurrent-preclean: 0.002/0.002 secs并发重新标记执行时间。

4.第四阶段 并发重复标记

  这个阶段是重复的做相同的事情直到发生aboart的条件。

  2017-12-19T16:08:33.043-0800: 11.134: 并发重新标记时间;CMS-concurrent-abortable-preclean-start并发重新标记开始标志; CMS-concurrent-abortable-preclean: 0.075/0.512 secs并发重新标记执行时间。

5.第五阶段 最终标记

  该阶段的任务是完成标记整个年老代的所有的存活对象。

  2017-12-19T16:08:33.555-0800: 11.647: 并发重新标记时间;CMS Final Remark 最终标记; YG occupancy: 1939 K (39296 K) 年轻代当前占用容量情况;

  2017-12-19T16:08:33.555-0800: 11.647: [Rescan (parallel) , 0.0038080 secs] 这个阶段,应用停止,完成最终标记

  2017-12-19T16:08:33.559-0800: 11.651: [weak refs processing, 0.0000223 secs] 第一个子阶段;

  2017-12-19T16:08:33.559-0800: 11.651: [class unloading, 0.0002446 secs] 第二个子阶段;

  2017-12-19T16:08:33.560-0800: 11.651: [scrub symbol table, 0.0004310 secs]第三个子阶段

  2017-12-19T16:08:33.560-0800: 11.651: [scrub string table, 0.0001471 secs]第四个子阶段

  [1 CMS-remark: 32503K(87424K)] 34443K(126720K), 0.0047693 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]

6.第六阶段 并发清理

  这个阶段的目的就是移除那些不用的对象。

  2017-12-19T16:08:33.560-0800: 11.652:清理的时间;[CMS-concurrent-sweep-start] 开始清理标志

   2017-12-19T16:08:33.572-0800: 11.663:清理的时间  [CMS-concurrent-sweep: 0.011/0.011 secs]  清理花费的时间[Times: user=0.01 sys=0.00, real=0.01 secs]

7.第七阶段 重置

  重新设置CMS算法内部的数据结构,准备下一个CMS生命周期的使用。

  2017-12-19T16:08:33.572-0800: 11.663: [CMS-concurrent-reset-start]

  2017-12-19T16:08:33.576-0800: 11.668: [CMS-concurrent-reset: 0.004/0.004 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]

  

Full GC

2017-12-19T14:20:21.524-0800: 0.745: [Full GC (Ergonomics) [PSYoungGen: 5120K->0K(71680K)] [ParOldGen: 98922K->96623K(207872K)] 104042K->96623K(279552K), [Metaspace: 2635K->2635K(1056768K)], 0.8495748 secs] [Times: user=1.81 sys=0.04, real=0.85 secs] 

  2017-12-19T14:20:21.524-0800: 0.745: GC发生的时间。PSYoungGen 表示是Parallel Scavenge新时代收集器;5120K表示GC前的年轻代大小; 0K表示GC后的年轻代大小; 71680K年轻代的总大小。ParOldGen表示是Parallel Old收集器;98922K表示GC前的老年代大小;96623K表示GC前的老年代大小;207872K表示老年代总大小;104042K表示GC前的总大小;96623K表示GC后的总大小;279552K表示总大小;

java虚拟机小贴士之GC分析的更多相关文章

  1. java虚拟机(十二)--可视化工具分析GC日志

    在上篇博客中,我们学习了Parallel.CMS.G1三种垃圾收集器的日志格式,本次我们通过工具去分析日志,会更加的直观 日志格式博客地址:java虚拟机(十一)--GC日志分析 GCeasy: 这是 ...

  2. 深入理解JAVA虚拟机(内存模型+GC算法+JVM调优)

    目录 1.Java虚拟机内存模型 1.1 程序计数器 1.2 Java虚拟机栈 局部变量 1.3 本地方法栈 1.4 Java堆 1.5 方法区(永久区.元空间) 附图 2.JVM内存分配参数 2.1 ...

  3. 《深入理解Java虚拟机》调优案例分析与实战

    上节学习回顾 在上一节当中,主要学习了Sun JDK的一些命令行和可视化性能监控工具的具体使用,但性能分析的重点还是在解决问题的思路上面,没有好的思路,再好的工具也无补于事. 本节学习重点 在书本上本 ...

  4. Java虚拟机三:OutOfMemoryError异常分析

    根据Java虚拟机规范,虚拟机内存中除过程序计数器之外的运行时数据区域都会发生OutOfMemoryError(OOM),本文将通过实际例子验证分析各个数据区域OOM的情况.为了更贴近生产,本次所有例 ...

  5. 大战Java虚拟机【2】—— GC策略

    前言 前面我们已经知道了Java虚拟机所做的事情就是回收那些不用的垃圾,那些不用的对象.那么问题来了,我们如何知道一个对象我们不需要使用了呢?程序在使用的过程中会不断的创建对象,这些所创建的对象指不定 ...

  6. 【转载】Java虚拟机类加载机制与案例分析

    出处:https://blog.csdn.net/u013256816/article/details/50829596 https://blog.csdn.net/u013256816/articl ...

  7. 深入理解Java虚拟机(六)——JVM调优分析与实战

    大内存硬件上的程序部署策略 单个虚拟机管理大内存 出现问题 如果JVM中的堆内存太小,就会频繁地出发GC,而每次GC会将用户线程暂停,所以,频繁地GC会导致长时间的停顿.如果扩大计算的内存的大小,就能 ...

  8. java虚拟机学习总结之GC回收算法与GC收集器

    GC回收算法 1.标记清除算法分为标记阶段和清除阶段标记阶段:通过特定的判断方式找出无用的对象实例并将其标记清除阶段:将已标记的对象所占用的内存回收缺点:运行多次以后容易产生空间碎片,当需要一整段连续 ...

  9. (一)深入java虚拟机之内存溢出与分析

    一.内存溢出程序 public class Test { public static void main(String[] args) { List<User> userList=new ...

随机推荐

  1. 《Java从入门到失业》第二章:Java环境(四):IDE集成环境

    2.4IDE集成环境 在掌握了编写.编译和运行Java程序的基本步骤以后,你肯定就在想,这太麻烦了,有没有更好的工具?当然有了,那就是IDE.IDE就是专业的集成开发环境(Integrated Dev ...

  2. JavaScript学习系列博客_14_JavaScript中对象的基本操作

    对象的基本操作 - 创建对象 - 方式一:使用new关键字调用的函数,是构造函数(constructor),构造函数是专门用来创建对象的函数. var obj = new Object(); - 方式 ...

  3. springMVC入门(五)------统一异常处理

    简介 系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过异常捕获获取异常信息,后者需通过规范代码.提高代码路绑定减少运行时异常的发生 异常处理思路:无论dao层.ser ...

  4. centos AAVMF_CODE.fd 文件下载

    centos: yum install AAVMF -y ubuntu: apt-get install qemu-efi*

  5. Java算法——回溯法

    回溯法一种选优搜索法,又称试探法.利用试探性的方法,在包含问题所有解的解空间树中,将可能的结果搜索一遍,从而获得满足条件的解.搜索过程采用深度遍历策略,并随时判定结点是否满足条件要求,满足要求就继续向 ...

  6. 在Unity中检测死循环和卡死

    当游戏在手机/模拟器上卡死,logcat没有日志输出,也没有卡死堆栈信息或者bugly也没有捕获到异常,你是否很焦急?本文介绍一下我们项目中检测Unity卡死的方法,也许适合你使用. 实现原理 在绝大 ...

  7. GitHub 热点速览 Vol.34:亚马逊、微软开源项目带你学硬核技术

    作者:HelloGitHub-小鱼干 摘要:站在巨人的肩膀上才能看得更远,本周上榜的 computervision-recipes 便是典型代表,这个由微软开源的计算机视觉最佳实践项目,多次上 Git ...

  8. python3.6和pip3:Ubuntu下安装升级与踩坑之路

    本文以Ubuntu16.x系统为例,演示如何安装python3.6和相应环境.安装Python3的机器必须要能访问外网才能进行如下操作! 1. 安装方式 在Ubuntu下安装python有两种方式: ...

  9. SpringBoot系列——MyBatis-Plus整合封装

    前言 MyBatis-Plus是一款MyBatis的增强工具(简称MP),为简化开发.提高效率,但我们并没有直接使用MP的CRUD接口,而是在原来的基础上封装一层通用代码,单表继承我们的通用代码,实现 ...

  10. python yaml文件数据按原有的数据顺序dump

    yml文件的更新后工具类: import os import yaml class YamlUtils(): def __init__(self,folder_name='config'): self ...