• 理解Java的GC日志


    一、日志分析 
    理解GC日志是处理Java虚拟机内存问题的基本技能,下面我们具体来看看。

    通过在java命令种加入参数来指定对应的gc类型,打印gc日志信息并输出至文件等策略。

    1、编写java代码

    1. public class ReferenceCountingGC {
    2. public Object instance = null;
    3. private static final int ONE_MB = 1024 * 1024;
    4.  
    5. private byte[] bigSize = new byte[2 * ONE_MB];
    6.  
    7. public static void main(String[] args) {
    8. testGC();
    9.  
    10.  
    11. }
    12.  
    13. public static void testGC() {
    14. ReferenceCountingGC objA = new ReferenceCountingGC();
    15. ReferenceCountingGC objB = new ReferenceCountingGC();
    16. objA.instance = objB;
    17. objB.instance = objA;
    18.  
    19. objA = null;
    20. objB = null;
    21.  
    22. System.gc();
    23. }
    24. }

    2、编译java文件

    javac ReferenceCountingGC.java  
    • 1

    3、执行class文件

    java -XX:+PrintGCDateStamps -XX:+PrintGCDetails ReferenceCountingGC
    • 1

    对应的参数列表

    1. -XX:+PrintGC 输出GC日志
    2. -XX:+PrintGCDetails 输出GC的详细日志
    3. -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
    4. -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800
    5. -XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
    6. -Xloggc:../logs/gc.log 日志文件的输出路径
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果输出:

    1. 2016-03-20T14:34:55.118-0800: [GC [PSYoungGen: 6123K->400K(38912K)] 6123K->400K(125952K), 0.0012070 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
    2. 2016-03-20T14:34:55.119-0800: [Full GC [PSYoungGen: 400K->0K(38912K)] [ParOldGen: 0K->282K(87040K)] 400K->282K(125952K) [PSPermGen: 2622K->2621K(21504K)], 0.0084640 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
    3. Heap
    4. PSYoungGen total 38912K, used 1013K [0x00000007d5500000, 0x00000007d8000000, 0x0000000800000000)
    5. eden space 33792K, 3% used [0x00000007d5500000,0x00000007d55fd7d0,0x00000007d7600000)
    6. from space 5120K, 0% used [0x00000007d7600000,0x00000007d7600000,0x00000007d7b00000)
    7. to space 5120K, 0% used [0x00000007d7b00000,0x00000007d7b00000,0x00000007d8000000)
    8. ParOldGen total 87040K, used 282K [0x0000000780000000, 0x0000000785500000, 0x00000007d5500000)
    9. object space 87040K, 0% used [0x0000000780000000,0x0000000780046bf8,0x0000000785500000)
    10. PSPermGen total 21504K, used 2628K [0x000000077ae00000, 0x000000077c300000, 0x0000000780000000)
    11. object space 21504K, 12% used [0x000000077ae00000,0x000000077b091380,0x000000077c300000)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    PSYoungGen表示新生代,这个名称由收集器决定,这里的收集器是Parallel Scavenge。老年代为ParOldGen,永久代为PSPermGen 
    如果收集器为ParNew收集器,新生代为ParNew,Parallel New Generation 
    如果收集器是Serial收集器,新生代为DefNew,Default New Generation

    可以看到上面有两种GC类型:GC和Full GC,有Full表示这次GC是发生了Stop-The-World的。

    新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度非常快。

    老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC,Major GC的速度一般会比Minor GC慢10倍以上。

    [GC [PSYoungGen: 6123K->400K(38912K)] 6123K->400K(125952K), 0.0012070 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

    上面方括号内部的6123K->400K(38912K),表示GC前该内存区域已使用容量->GC后该内存区域已使用容量,后面圆括号里面的38912K为该内存区域的总容量。

    方括号外面的6123K->400K(125952K),表示GC前Java堆已使用容量->GC后Java堆已使用容量,后面圆括号里面的125952K为Java堆总容量。

    [Times: user=0.00 sys=0.00, real=0.00 secs]分别表示用户消耗的CPU时间,内核态消耗的CPU时间和操作从开始到结束所经过的墙钟时间(Wall Clock Time),CPU时间和墙钟时间的差别是,墙钟时间包括各种非运算的等待耗时,例如等待磁盘I/O、等待线程阻塞,而CPU时间不包括这些耗时。

    二、GC日志的离线分析

    可以使用一些离线的工具来对GC日志进行分析,比如sun的gchisto( https://java.net/projects/gchisto),gcviewer( https://github.com/chewiebug/GCViewer ),这些都是开源的工具,用户可以直接通过版本控制工具下载其源码,进行离线分析。

     

     https://blog.csdn.net/u014756827/article/details/78227556

  • 相关阅读:
    问题解决:在js中绑定onclick事件为什么不加括号,在html代码中必须要加?(转载)
    web前端学习(四)JavaScript学习笔记部分(4)-- JavaScriptDOM对象
    web前端学习(四)JavaScript学习笔记部分(3)-- JavaScript函数+异常处理+事件处理
    web前端学习(四)JavaScript学习笔记部分(2)-- JavaScript语法详解
    web前端学习(四)JavaScript学习笔记部分(1)-- JavaScript基础教程
    web前端学习(三)css学习笔记部分(10)-- 初级开发工程师面试题
    web前端学习(三)css学习笔记部分(9)-- 初级开发工程师实战
    web前端学习(三)css学习笔记部分(8)-- SVN的介绍和应用、CSS动画效果、CSS3布局属性全接触
    关于rss的内容(转载)
    Django框架简介及模板Template,filter
  • 原文地址:https://www.cnblogs.com/tiancai/p/9283289.html
Copyright © 2020-2023  润新知