打印日志

  通过加入 -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. Python基础入门知识点——深浅拷贝

    深浅拷贝 对象引用.浅拷贝.深拷贝(拓展.难点.重点) Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果 其实这个是由于共享内存导致的结果 拷贝 ...

  2. C# IObservable与IObserver观察者模式

    C#中提供了IObservable<T>接口和IObserver<T>接口来实现观察者模式,IObservable<T>相当于Subject(主题)接口,下面我们就 ...

  3. docker入门2-docker service

    docker service介绍 service是生产环境中某个image的container集合.一个service只使用一个image,但它编排这个image的运行方式,比如使用哪个端口,根据需求 ...

  4. PythonCrashCourse 第十章习题

    在文本编辑器中新建一个文件,写几句话来总结一下你至此学到的Python知识,其中每一行都以"In Python you can"打头.将这个文件命名为 learning_pytho ...

  5. tar.gz文件的压缩与解压

    1 解压".xz" xz -d your_file_name.tar.xz 注:运行上述命令后your_file_name.tar.xz会被删除 2 解包".tar&qu ...

  6. Flink的应用场景和架构

    Flink的应用场景 Flink项目的理念就是:Flink是为分布式,高性能,随时可用以及准确的流处理应用程序打造的开源流处理框架.自2019年开源以来,迅速成为大数据实时计算领域炙手可热的技术框架. ...

  7. 利用python爬取贝壳网租房信息

    最近准备换房子,在网站上寻找各种房源信息,看得眼花缭乱,于是想着能否将基本信息汇总起来便于查找,便用python将基本信息爬下来放到excel,这样一来就容易搜索了. 1. 利用lxml中的xpath ...

  8. 《MySQL数据库》MySQL主从复制搭建与原理

    前言 主从复制:两台或者更多的数据库实例,通过二进制日志,实现数据同步.为什么需要主从复制,主从复制的作用是什么,答:为了预防灾难. 搭建 第一步:准备多实例环境.如何创建多实例见: 第二步:确保每一 ...

  9. 广度优先搜索(BFS)解题总结

    定义 广度优先搜索算法(Breadth-First-Search),是一种图形搜索算法. 简单的说,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点. 如果所有节点均被访问,则算法中止. B ...

  10. ORA-01455: converting column overflows integer datatypes.

    系统执行抛了一个ORA-01455: converting column overflows integer datatypes.把当时执行的SQL取出来,在plsql developer里面执行是没 ...