打印日志

  通过加入 -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. 分析dubbo心跳检测机制

    目的: 维持provider和consumer之间的长连接 实现: dubbo心跳时间heartbeat默认是60s,超过heartbeat时间没有收到消息,就发送心跳消息(provider,cons ...

  2. 团队作业4:第六篇Scrum冲刺博客(歪瑞古德小队)

    目录 一.Daily Scrum Meeting 1.1 会议照片 1.2 项目进展 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3.2 Code Review 记录 3.3 issue ...

  3. python字典的概念与基本操作

    字典是非常常用的一种数据结构,它与json格式的数据非常相似,核心就是以键值对的形式存储数据,关于Python中的字典做如下四点说明: 1.构造字典对象需要用大括号表示 {},每个字典元素都是以键值对 ...

  4. 用Springboot+Jpa实现学生CRUD操作(含前端页面,含分页,自定义SQL)

    前期准备 使用idea新建个SpringBoot项目 参考博客:https://blog.csdn.net/Mr_Jixian/article/details/89742366?tdsourcetag ...

  5. 超市管理系统C语言

    登录系统 # include <stdio.h> //头文件 # include <string.h> //字符串头文件 # include <stdlib.h> ...

  6. React技术实践(1)

    随着系统越来越庞大,前端也变得越来越复杂,因此,构建一套组件化的前端变得很重要了. 之前一直在使用Asp.net来进行前端的组件化,Asp.net组件化有个很大的缺陷,就是和后台代码绑定太紧密了,不符 ...

  7. Java学习笔记——java基础

    2020.9.1 学习来自 https://www.liaoxuefeng.com/wiki/1252599548343744/1255883729079552 一.变量和数据类型 基本数据类型 基本 ...

  8. 每日JS逆向练习之斗鱼登录密码加密,今天你练了吗?

    一切的基本功都是为后期调试滑块验证码准备的. 有兴趣的关注一下知识图谱与大数据公众号,当然不关注也无所谓.今天来看看斗鱼登录密码加密,正所谓熟能生巧,这种简单一点的基本3-5分钟就要能抠出来,有兴趣得 ...

  9. MySQL锁这块石头似乎没有我想的那么重

    前言 前言为本人写这篇文章的牢骚,建议跳过不看.   之前好几次都想好好的学习MySQL中的锁,但是找了几篇文章,看了一些锁的类型有那么多种,一时间也没看懂是什么意思,于是跟自己说先放松下自己,便从书 ...

  10. sqlmap 的 --forms之理解

    对于一个页面的form表单中的数据进行注入测试 方法有三个 ①burp抓包 将数据储存为文本文件  然后 sqlmap中使用 -r 参数进行测试 ②使用 --data参数,将数据进行测试 ③直接使用- ...