文章目录

  • 一、常见参数列表
  • 二、设置参数位置
  • 三、参数设置演示
  • 四、日志补充说明
  • 五、工具查看日志

一、常见参数列表

1、目的:通过阅读GC日志,我们可以了解Java虛拟机内存分配与回收策略。

2、内存分配与垃圾回收的参数列表:

(1)-XX:+PrintGC 输出GC日志(这个只会显示总的GC堆的变化)。类似: -verbose:gc

(2)-XX:+PrintGCDetails 输出GC的详细日志(我最常用)

(3)-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)

(4)-XX:+PrintGCDateStamp 输出GC的时间戳(以日期的形式,如:2020-08-13T22:17:35.354+0800

(5)-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息

(6)-Xloggc:./logs/gc.log 日志文件的输出路径(后面有演示)

(7)-XX:+PrintCommandLineFlags查看JDK不同版本使用的垃圾回收器

(8)-Xms600m -Xmx600m 初始化堆内存大小和最大堆内存大小

(9)-XX:MetaspaceSize=500m -XX:MaxMetaspaceSize=500m 初始化元空间大小和最大元空间大小

第八和第九点在这篇文章中有讲到,可以看看.OutofMemoryError的出现原因分析 及解决方案 内存溢出及泄露

二、设置参数位置

1、普通类(没有服务器)

2、服务器(Tomcat演示)

三、参数设置演示

1、-verbose:gc (或者-XX:+PrintGC)注意:不要有任何空格
在演示-XX:+PrintGC时我的机器一直打印不出来信息,我也不知道为什么,也没有到查阅资料,抱歉,这个你们就试试吧,但是这不重要,这个打印的信息只有显示总的GC堆的变化,一般不会用这个参数的。

2、-XX:+PrintGCDetails(打印详细信息,新生代和老年代包括元空间都有(jdk1.8))

(1)要是您的程序没有进行GC的话,为了演示可以创建一个大对象占有堆空间就好了(或者调节堆空间的大小),我测试的代码:

package com.dai.test1;import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;public class SoftReferenceTest {public static void main(String[] args) {ArrayList<Object> list = new ArrayList<>();for (int i = 0; i < 500; i++) {byte[] bytes = new byte[1024 * 100];//100kBlist.add(bytes);}}
}

(2)运行程序,会将GC的信打印到控制台

(3)注意:新生代后面的 total 内存是指可用的内存大小,没有算当前未使用的那个幸存者区(S0区、S1区只会算一个的占用空间)

3、-XX:+PrintGCTimeStamps(虚拟机启动以来的时间)

4、-XX:+PrintGCDateStamps(详细时间戳)

四、日志补充说明

1、" [GC" 和 " [Full GC" 说明的是这次垃圾收集的停顿类型,如果有 " Full" 则说明GC发生了"Stop The World"

使用Serial收集器在新生代的名字是Default New Generation,因此显示的是" [DefNew"
使用ParNew收集器在新生代的名字会变成" [ParNew" ,意思是"Parallel New Generation"
使用Paralrel Scavenge收集 器在新生代的名字是" [PSYoungGen"

另外:七大经典垃圾回收器篇+部分调优 不会让你失望(两万字)

2、老年代的收集和新生代道理一样,名字也是收集器决定的

3、使用G1收集器的话,会显示为"garbage- first heap"

4、Allocation Failure表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了。

5、[PSYoungGen: 5986K->696K(8704K) ] 59861-> 704K (9216K)中括号内: GC回收前年轻代大小,回收后大小,( 年轻代总大小)括号外: GC回收前年轻代和老年代大小,回收后大小,( 年轻代和老年代总大小)

6、user代表用户态回收耗时,sys内核态回收耗时,rea实际耗时。由于多核的原因,时间总和可能会超过rea1时间

7、GC:

8、Full GC:(图要是太小看不清可以Ctrl + 鼠标滚动 放大查看)

五、工具查看日志

1、首先说一下有什么工具可以分析GC日志呢?
常用的日志分析工具有: GCeasy(推荐)GCViewer(软件)、GCHisto、GCLogViewerHpjmeter、garbagecat等。

2、GCeasy:这个工具是免费的在线版的,也就是直接在浏览器上选择你的日志文件,就可以给你动态的分析出各种参数信息,十分方法和快捷,关键是它的界面是超级好看的,以下就用GCeasy来演示。

另外:GCViewer,这一款工具是在客户端软件,下载解压就可以用,还是挺方便的。启动时截图:

以下演示的思路:在IDEA中生成log文件,然后放在GCeasy上查看详细信息

3、生成log日志文件

(1)先在项目的根目录创建一个logs包,用于存放一会新建的gc.log日志文件(默认相对路径是在根目录,而不是在当前Module下),利用-Xloggc:./logs/gc.log生成log文件


参数:-Xloggc:./logs/gc.log

(2)执行程序,生成gc.log文件,将其复制到桌面,方便一会上传到GCeasy工具中


4、GCeasy工具在线使用地址:https://gceasy.io/

(1)进入官网之后,导入桌面的gc.log文件。



(2)进入分析,接下来全是中文,你就可以慢慢看了,这界面好看吧!





全是动态的给你分析得明明白白的,完结

另外我还写了一篇 深解Java虚拟机(JVM)内存结构各部分总结【三层划分】方便大家学习和面试前复习

有用点个关注,手留余香!

带你读懂Java GC日志信息 教你如何使用工具查看【图文演示】相关推荐

  1. JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)

    JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...

  2. 简单一文带你读懂Java变量的作用和三要素

    Java变量的作用 不只是java,在其他的编程语言中变量的作用只有一个:存储值(数据) 在java中,变量本质上是一块内存区域,数据存储在java虚拟机(JVM)内存中 变量的三要素 变量的三要素分 ...

  3. 1.6 万字长文带你读懂 Java IO

    Java IO 是一个庞大的知识体系,很多人学着学着就会学懵了,包括我在内也是如此,所以本文将会从 Java 的 BIO 开始,一步一步深入学习,引出 JDK1.4 之后出现的 NIO 技术,对比 N ...

  4. 窥一斑而知全豹,几分钟带你读懂Java字节码,再也不怕了

    目录 1.如何看字节码 2.一个简单的例子 3.字节码结构 4.总结: 引言:都知道java的源文件最后会被编译成class文件,class文件的内容是字节码.为什么java要编译成字节码呐?我觉得最 ...

  5. 一文带你读懂Java字节码

    文章目录 前言 准备事宜 1 下载UltraEdit 下载Java虚拟机规范(Java SE 8版) 一.生成字节码 二.字节码阅读 class文件总览 魔数与副主版本号 常量池 字段 方法 统一讲解 ...

  6. java 源码系列 - 带你读懂 Reference 和 ReferenceQueue

    java 源码系列 - 带你读懂 Reference 和 ReferenceQueue https://blog.csdn.net/gdutxiaoxu/article/details/8073858 ...

  7. java ee 值范围_一篇文章带你读懂: Java EE

    原标题:一篇文章带你读懂: Java EE 点击上图,查看教学大纲 何为 Java EE Java EE是一个标准中间件体系结构 不要被名称"Java PlatformEnterprise ...

  8. java中date类型如何赋值_一文读懂java中的Reference和引用类型

    简介 java中有值类型也有引用类型,引用类型一般是针对于java中对象来说的,今天介绍一下java中的引用类型.java为引用类型专门定义了一个类叫做Reference.Reference是跟jav ...

  9. gc日志一般关注什么_Java架构师必懂的GC日志知识

    在Java,Android,C#等中,GC是自动的,而在几种前代编程语言(C,C ++)中,程序员必须明确编写代码才能释放对象. 所以,这对于Java,Android和C#应用程序开发人员来说是一个很 ...

最新文章

  1. 什么是互联网大厂_仅限今天!大厂最热数据分析经典实战项目大公开!
  2. ppt算是php的一种吗,ppt放映快捷键是什么
  3. 合成大西瓜html源码,index.html
  4. 海信FW3010-5000H千兆防火墙
  5. JSP 插入到数据库的数据出现 “SQLServerException: 将截断字符串或二进制数据” 错误解决方案
  6. Codeforces Round #693 (Div. 3)A~G解题报告
  7. json 解析_json爬坑1:yajl解析json
  8. 学习C++必须掌握的概念
  9. 深度学习(十五)基于级联卷积神经网络的人脸特征点定位-CVPR 2013
  10. 异常处理1:复习、异常概述和异常体系结构
  11. matlab扫雷代码及运用解释,MATLAB_百科
  12. 如何安装Pycharm和汉化包(包括安装软件,无广告)
  13. 阿里云国际版云服务器Linux和Windows操作系统的链路测试工具-Unirech
  14. Google Guice简介
  15. 使用opencv应用程序正常初始化失败0xc000000d解决办法
  16. 【CS】软件测试概念Software Testing
  17. 现货白银价格走势分析
  18. Apriltag编解码系统
  19. 全局快门和卷帘快门(Global shutter and Rolling shutter)
  20. intell idea怎么恢复默认设置

热门文章

  1. 【IT项目管理】第7章 习题
  2. SQL生成临时表id自增列
  3. 初学者关于ztree的浅谈
  4. include静态引入jsp与动态引入jsp的区别
  5. 久坐会以何种方式、何种程度伤害你的身体?
  6. php - php-fpm 启动报错 :Segmentation fault $php_fpm_BIN $php_opts / Gracefully shutting down php(完美解决方案)
  7. 企业为什么需要上网行为管理
  8. 腾讯文档智能表格定时自动提醒如何设置?
  9. Jenkins WebSphere 部署
  10. 理解车削 3dmax