Java虚拟机GC日志分析

作者:Mirhunana 时间:2023-02-21 15:04:40 

本文研究的主要是Java虚拟机中gc日志的理解问题,具体如下。

一、日志分析

理解GC日志是处理Java虚拟机内存问题的基本技能。

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

1、编写java代码


public class ReferenceCountingGC {
public Object instance = null;
private static final int ONE_MB = 1024 * 1024;
private byte[] bigSize = new byte[2 * ONE_MB];
public static void main(String[] args) {
testGC();
}
public static void testGC() {
ReferenceCountingGC objA = new ReferenceCountingGC();
ReferenceCountingGC objB = new ReferenceCountingGC();
objA.instance = objB;
objB.instance = objA;
objA = null;
objB = null;
System.gc();
}
}

2、编译java文件


javac ReferenceCountingGC.java

3、执行class文件


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

对应的参数列表

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

结果输出:

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]
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]
Heap
PSYoungGen total 38912K, used 1013K [0x00000007d5500000, 0x00000007d8000000, 0x0000000800000000)
eden space 33792K, 3% used [0x00000007d5500000,0x00000007d55fd7d0,0x00000007d7600000)
from space 5120K, 0% used [0x00000007d7600000,0x00000007d7600000,0x00000007d7b00000)
to space 5120K, 0% used [0x00000007d7b00000,0x00000007d7b00000,0x00000007d8000000)
ParOldGen total 87040K, used 282K [0x0000000780000000, 0x0000000785500000, 0x00000007d5500000)
object space 87040K, 0% used [0x0000000780000000,0x0000000780046bf8,0x0000000785500000)
PSPermGen total 21504K, used 2628K [0x000000077ae00000, 0x000000077c300000, 0x0000000780000000)
object space 21504K, 12% used [0x000000077ae00000,0x000000077b091380,0x000000077c300000)

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 ),这些都是开源的工具,用户可以直接通过版本控制工具下载其源码,进行离线分析。

来源:http://blog.csdn.net/hp910315/article/details/50936629

标签:java,虚拟机,gc
0
投稿

猜你喜欢

  • SpringDataJpa like查询无效的解决

    2021-12-02 11:32:40
  • spring mvc 组合mybatis框架实例详解

    2023-11-28 04:56:04
  • SpringBoot java-jar命令行启动原理解析

    2022-02-02 10:32:22
  • Android轻松实现多语言的方法示例

    2023-02-17 19:33:38
  • RabbitMQ延迟队列及消息延迟推送实现详解

    2023-11-15 15:31:31
  • 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out

    2022-06-08 16:36:41
  • 深入浅析Spring 的aop实现原理

    2023-01-10 00:00:10
  • 线程池中使用spring aop事务增强

    2021-08-06 06:37:19
  • Java自定义线程池的实现示例

    2022-01-23 01:28:04
  • springboot集成mybatisplus的方法

    2022-08-02 16:35:12
  • Linux CentOS 7.0中java安装与配置环境变量的步骤详解

    2021-11-15 12:31:34
  • Java并发编程同步器CountDownLatch

    2022-10-17 18:59:34
  • 基于C语言实现静态通讯录的示例代码

    2023-07-02 22:07:38
  • Mybatis配置错误:java.lang.ExceptionInInitializerError

    2021-12-31 16:58:59
  • 在IDEA使用中directory和package的操作

    2022-07-05 22:05:53
  • C++ 继承,虚继承(内存结构)详解

    2023-09-05 21:28:01
  • 基于Spring AOP proxyTargetClass的行为表现总结

    2022-05-23 18:33:43
  • Android编程实现将应用强制安装到手机内存的方法

    2022-09-09 23:02:08
  • Android开发之滑动数值选择器NumberPicker用法示例

    2022-08-04 07:22:36
  • Android自定义View之继承TextView绘制背景

    2021-11-05 11:16:06
  • asp之家 软件编程 m.aspxhome.com