带你读懂Java GC日志信息 教你如何使用工具查看【图文演示】
文章目录
- 一、常见参数列表
- 二、设置参数位置
- 三、参数设置演示
- 四、日志补充说明
- 五、工具查看日志
一、常见参数列表
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日志信息 教你如何使用工具查看【图文演示】相关推荐
- JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)
JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...
- 简单一文带你读懂Java变量的作用和三要素
Java变量的作用 不只是java,在其他的编程语言中变量的作用只有一个:存储值(数据) 在java中,变量本质上是一块内存区域,数据存储在java虚拟机(JVM)内存中 变量的三要素 变量的三要素分 ...
- 1.6 万字长文带你读懂 Java IO
Java IO 是一个庞大的知识体系,很多人学着学着就会学懵了,包括我在内也是如此,所以本文将会从 Java 的 BIO 开始,一步一步深入学习,引出 JDK1.4 之后出现的 NIO 技术,对比 N ...
- 窥一斑而知全豹,几分钟带你读懂Java字节码,再也不怕了
目录 1.如何看字节码 2.一个简单的例子 3.字节码结构 4.总结: 引言:都知道java的源文件最后会被编译成class文件,class文件的内容是字节码.为什么java要编译成字节码呐?我觉得最 ...
- 一文带你读懂Java字节码
文章目录 前言 准备事宜 1 下载UltraEdit 下载Java虚拟机规范(Java SE 8版) 一.生成字节码 二.字节码阅读 class文件总览 魔数与副主版本号 常量池 字段 方法 统一讲解 ...
- java 源码系列 - 带你读懂 Reference 和 ReferenceQueue
java 源码系列 - 带你读懂 Reference 和 ReferenceQueue https://blog.csdn.net/gdutxiaoxu/article/details/8073858 ...
- java ee 值范围_一篇文章带你读懂: Java EE
原标题:一篇文章带你读懂: Java EE 点击上图,查看教学大纲 何为 Java EE Java EE是一个标准中间件体系结构 不要被名称"Java PlatformEnterprise ...
- java中date类型如何赋值_一文读懂java中的Reference和引用类型
简介 java中有值类型也有引用类型,引用类型一般是针对于java中对象来说的,今天介绍一下java中的引用类型.java为引用类型专门定义了一个类叫做Reference.Reference是跟jav ...
- gc日志一般关注什么_Java架构师必懂的GC日志知识
在Java,Android,C#等中,GC是自动的,而在几种前代编程语言(C,C ++)中,程序员必须明确编写代码才能释放对象. 所以,这对于Java,Android和C#应用程序开发人员来说是一个很 ...
最新文章
- 什么是互联网大厂_仅限今天!大厂最热数据分析经典实战项目大公开!
- ppt算是php的一种吗,ppt放映快捷键是什么
- 合成大西瓜html源码,index.html
- 海信FW3010-5000H千兆防火墙
- JSP 插入到数据库的数据出现 “SQLServerException: 将截断字符串或二进制数据” 错误解决方案
- Codeforces Round #693 (Div. 3)A~G解题报告
- json 解析_json爬坑1:yajl解析json
- 学习C++必须掌握的概念
- 深度学习(十五)基于级联卷积神经网络的人脸特征点定位-CVPR 2013
- 异常处理1:复习、异常概述和异常体系结构
- matlab扫雷代码及运用解释,MATLAB_百科
- 如何安装Pycharm和汉化包(包括安装软件,无广告)
- 阿里云国际版云服务器Linux和Windows操作系统的链路测试工具-Unirech
- Google Guice简介
- 使用opencv应用程序正常初始化失败0xc000000d解决办法
- 【CS】软件测试概念Software Testing
- 现货白银价格走势分析
- Apriltag编解码系统
- 全局快门和卷帘快门(Global shutter and Rolling shutter)
- intell idea怎么恢复默认设置