GC 垃圾回收必须要保证一直性的快照中进行, 一直性的意思是指分析工作期间整个系统就像静止在一个时间点上, 不能在分析过程中对象关系还在发生变化,所以GC分析过程中必须要让JAVA程序停顿,Sun把这个事件称之为STW (Stop the World) , 打个比方, 《深入理解Java虚拟机》里作者举了一个例子, 我觉得十分恰当: 当你要打扫孩子的屋子时,你会让孩子做在椅子上不动,然后才能顺利的完成打扫房间。如果你一边打扫房间,孩子一边在房间里仍东西,你将永远无法完成打扫房间的工作

GC 垃圾回收时候会让JAVA程序停顿,从GC回收器的发展来看, GC算法的设计时候考虑最多的也就是如何减少这个停顿时间。当停顿时间越少其实系统的性能也就越好。 当停顿的次数或者时间越长,那么系统的性能也就越差。 因此对系统而言, 当系统性能变慢的时候,分析GC日志来确认问题点也就变得越来越重要了,我曾经遇到过一个问题,售后反馈说系统变得突然慢,性能很差,体验非常不好。 这个问题的原因就是虚拟机在频繁Full GC,FULL GC 就会产生Stop the world, 那么整个问题就变成了为什么系统会频繁Full GC 这里不再多说,因为这是另一个故事了

下面的示例说明如何打印、保存、查看GC日志

配置JVM参数打印GC日志

Run–>Edit Configuration–>VM options: -XX:+PrintGCDetails -verbose:gc -Xloggc:d:/gc.log

  • -XX:+PrintGCDetails 表示打印出GC的详细信息
  • -verbose:gc 表示开启gc日志
  • -Xloggc:d:/gc.log 表示日志的存放位置

这里用的IDE是Intellij IDEA , 如果是Eclips可以在

Run–>Run/Debug Configuration–> Arguments -> VMargument中修改参数

测试代码源码,这个代码还是使用前面分析finalize方法的例子

public class FinalizeEscapeGC {public static FinalizeEscapeGC SAVE_HOOK = null;public void isAlive() {System.out.println("yes,i am still alive:)");}@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("finalize mehtod executed!");FinalizeEscapeGC.SAVE_HOOK = this;}public static void main(String[] args) throws Throwable {SAVE_HOOK = new FinalizeEscapeGC();//对象第一次成功拯救自己SAVE_HOOK = null;System.gc();//因为finalize方法优先级很低,所以暂停0.5秒以等待它System.out.println("sleep 500");Thread.sleep(500);System.out.println("after sleep 500");if (SAVE_HOOK != null) {SAVE_HOOK.isAlive();} else {System.out.println("no,i am dead:(");}//下面这段代码与上面的完全相同,但是这次自救却失败了SAVE_HOOK = null;System.gc();//因为finalize方法优先级很低,所以暂停0.5秒以等待它Thread.sleep(500);if (SAVE_HOOK != null) {SAVE_HOOK.isAlive();} else {System.out.println("no,i am dead:(");}}}

执行后-Xloggc 配置的地址下会生成对应的日志, 截取部分日志信息

[1.097s][info][gc,phases      ] GC(1) Phase 1: Mark live objects 2.649ms
[1.097s][info][gc,phases,start] GC(1) Phase 2: Prepare for compaction
[1.097s][info][gc,phases      ] GC(1) Phase 2: Prepare for compaction 0.377ms
[1.097s][info][gc,phases,start] GC(1) Phase 3: Adjust pointers
[1.098s][info][gc,phases      ] GC(1) Phase 3: Adjust pointers 0.832ms
[1.098s][info][gc,phases,start] GC(1) Phase 4: Compact heap
[1.099s][info][gc,phases      ] GC(1) Phase 4: Compact heap 0.675ms
[1.099s][info][gc,heap        ] GC(1) Eden regions: 1->0(3)
[1.099s][info][gc,heap        ] GC(1) Survivor regions: 0->0(0)
[1.099s][info][gc,heap        ] GC(1) Old regions: 4->1
[1.099s][info][gc,heap        ] GC(1) Humongous regions: 0->0
[1.099s][info][gc,metaspace   ] GC(1) Metaspace: 6279K->6279K(1056768K)
[1.099s][info][gc             ] GC(1) Pause Full (System.gc()) 1M->0M(8M) 5.159ms
[1.099s][info][gc,cpu         ] GC(1) User=0.00s Sys=0.00s Real=0.00s
[1.600s][info][gc,heap,exit   ] Heap
[1.600s][info][gc,heap,exit   ]  garbage-first heap   total 8192K, used 984K [0x0000000681600000, 0x0000000800000000)
[1.600s][info][gc,heap,exit   ]   region size 1024K, 1 young (1024K), 0 survivors (0K)
[1.600s][info][gc,heap,exit   ]  Metaspace       used 6294K, capacity 6475K, committed 6528K, reserved 1056768K
[1.600s][info][gc,heap,exit   ]   class space    used 548K, capacity 606K, committed 640K, reserved 1048576K

日志描述说明:

  • [0.702s] 表示处理使用时间
  • [info ] 日志等级
  • GC(1) Eden regions 表示GC发生的位置
  • 3M->0M(14M) 表示GC当前状况 : 已经使用内存量 -> GC后内存状况 (该内存区域总容量)
  • 3.742ms :最后1个时间表示该区域GC占用的时间
  • User=0.00s Sys=0.00s Real=0.00s:这里面的user、sys和real与Linux的time命令所输出的时间含义一致,分别代表用户态消耗的CPU时间、内核态消耗的CPU事件和操作从开始到结束所经过的墙钟时间(Wall Clock Time)

GC垃圾收集日志可以帮助我们优化垃圾收集暂停时间,提高整体应用程序的响应时间,预测生产中断,降低计算成本,但是通过GC日志排查问题点会有一种大海捞针的感觉。但我们可以通过一些工具来帮助我们分析GC日志,比如gceasy,使用方式也很简单

首先访问 Universal JVM GC analyzer - Java Garbage collection log analysis made easy   (地址

https://gceasy.io/)通过页面选择要分析的GC日志,示意图如下

点击分析后就可以查看GC分析报告,示意图如下

上一篇:JVM虚拟机垃圾回收中的finalize方法作用https://blog.csdn.net/Beijing_L/article/details/120185907

JVM如何读GC日志以及如何使用工具分析相关推荐

  1. JVM基础系列第14讲:JVM参数之GC日志配置

    说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...

  2. 【Flink】Flink jvm参数配置GC日志

    1.概述 转载:Flink jvm参数配置GC日志 生产环境上,或者其他要测试 GC 问题的环境上,一定会配置上打印GC日志的参数,便于分析 GC 相关的问题. 但是可能很多人配置的都不够" ...

  3. 求求你了,配个GC日志呗,不然咋分析故障原因

    点击关注公众号,Java干货及时送达 生产环境上,或者其他要测试 GC 问题的环境上,一定会配置上打印GC日志的参数,便于分析 GC 相关的问题. 但是可能很多人配置的都不够"完美" ...

  4. JVM实用参数 GC日志

    为什么80%的码农都做不了架构师?>>>    原文章地址:http://blog.panaihua.com/archives/151 GC日志是一个很重要的工具,它准确记录了每一次 ...

  5. 044、JVM实战总结:高级工程师的硬核技能:JVM的Young GC日志应该怎么看?

    1.前文回顾 昨天给出示例代码,设置jvm参数,触发YoungGC,今天仔细分析GC日志,图解Young GC的执行过程 2.程序运行采用的默认JVM参数如何查看? 怎么看系统用的默认JVM参数? 给 ...

  6. JVM学习笔记-GC日志分析(对象优先在Eden区分配)

    前言 在进行GC日志分析前,先了解一下JVM虚拟机运行时数据区的主要划分: Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域 有各自的用途,以及创建和销毁 ...

  7. JVM:33 如何查看JVM的Full GC日志

    1. 示例代码 package com.webcode;public class Demo4 {public static void main(String[] args){byte[] array1 ...

  8. gc日志一般关注什么_JVM(23)JVM的Full GC日志

    喜欢文章的可以关注下公众号!谢谢支持!! 之前两篇文章已经分析了对象是如何进入老年代的,接着我们在这篇文章中演示一下,老年代的GC是如何触发的. 示例代码 GC日志 -XX:NewSize=10485 ...

  9. 如何查看yarn container日志 查看yarn任务所有container信息 yarn gc日志的查看和简单分析

    查看yarn任务日志 任务运行中和结束时查看container的日志 GC日志的简单分析 文章目录 一.shell和yarn基础命令准备 二.app日志查看 1. 直接使用yarn logs,可选择指 ...

  10. 在linux上gc日志详解,JVM Parallel Scavenge GC日志详解

    Parallel Scavenge 日志格式 -XX:+PrintGCDetails [GC (Allocation Failure) [PSYoungGen: 127520K->20064K( ...

最新文章

  1. 2022-2028年中国塑料合成革的制造行业市场全景评估及发展趋势研究报告
  2. 博士生宿舍条件太好,本科生因疫情暂住惊到结巴!网友:不然咱读个博?
  3. 【BFS宽度优先搜索】
  4. add-apt-repository:找不到命令_手把手教你使用nodejs编写cli(命令行)
  5. C语言高级编程:sizeof计算数组大小需要注意的问题
  6. opencv python 多帧降噪算法_OpenCV-Python中用于视频跟踪的Meanshift和Camshift算法介绍...
  7. docker mysql主从复制
  8. 完全关闭App的两种做法
  9. 杭州恒生数米基金网招聘1-3年本科.NET软件工程师
  10. iOS UITableView设置UITableViewStyleGrouped模式下section间多余间距的处理
  11. shell脚本合并文件内容
  12. Ubuntu:conda的安装与使用
  13. 用图片来搜索 教你玩转Google按图搜索
  14. Dialog_xml制作——博客地址
  15. 代码实现-CVPR2020-Dynamic Convolution: Attention over Convolution Kernels
  16. Java多个文件根据URL下载后打包zip导出
  17. 拯救者y7000p进入BIOS
  18. Java数字加密(加密解密)
  19. Relation (mathematics)
  20. Unity 物体移动碰撞抖动(原因和解决方法)

热门文章

  1. dell无法启动计算机,戴尔电脑装系统蓝屏无法启动怎么办
  2. ios中常用英语单词汇总
  3. grep正则表达式后面的单引号和双引号的区别?
  4. 回归分析beta值的标准_Beta值的基本原理及使用说明
  5. Python实现汉字人名按拼音或笔画顺序排序
  6. spring security3 使用自定义MD5或者其他加密规则
  7. java 线程休眠 假死,java多线程-jstack线程阻塞问题排查
  8. 最全面的应届毕业生落户上海指南(2021)
  9. 开源中国众包平台的个人空间 工作日志 正文 关于你对软件众包的误解,你真的错了。
  10. ArcGIS影像多种裁剪方法