这一节穿插一点如何在eclipse中配置并查看某个Java应用GC日志的知识点,我也是通过调研知道的,因为书中写的不是很详细,主要是为下一节做准备。

一、eclipse中配置GC

在eclipse中如果要给某个应用配置GC日志,首先右击该应用(main方法所在的类)->Run As->Run Configurations->Arguments,在VM arguments中配置如下参数:

-Xms20m //最小堆内存
-Xmx20m //最大堆内存
-XX:+PrintGCTimeStamps  //打印GC时间
-XX:+PrintGCDetails      //打印GC的详细信息
-verbose:gc //开启GC日志
-Xloggc:d:/gc4.log  //GC日志存放的位置,后面就是查看这个日志文件
-Xmn10M  //新生代内存区域的位置
-XX:SurvivorRatio=8  //在复制算法中Eden区和Survivor区的比例(后续章节会细说)

如下图所示:

配置完成之后点击Applay->Run,等程序运行完之后可以到刚才配置的日志路径中,找到相应的文件进行查看。

二、查看GC

下面以一个具体的实例来查看并分析一下GC日志

1、创建三个互相引用的对象实例

2、配置GC

3、查看日志内容

Java HotSpot(TM) 64-Bit Server VM (25.121-b13) for windows-amd64 JRE (1.8.0_121-b13), built on Dec 12 2016 18:21:36 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 4057600k(480696k free), swap 8113324k(3128576k free)
CommandLine flags: -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:MaxNewSize=10485760 -XX:NewSize=10485760 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
0.121: [GC (System.gc()) [PSYoungGen: 4219K->680K(9216K)] 4219K->3760K(19456K), 0.0024028 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.124: [Full GC (System.gc()) [PSYoungGen: 680K->0K(9216K)] [ParOldGen: 3080K->3639K(10240K)] 3760K->3639K(19456K), [Metaspace: 2587K->2587K(1056768K)], 0.0062622 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]
Heap
PSYoungGen total 9216K, used 82K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
eden space 8192K, 1% used [0x00000000ff600000,0x00000000ff614920,0x00000000ffe00000)
from space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
to space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
ParOldGen total 10240K, used 3639K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
object space 10240K, 35% used [0x00000000fec00000,0x00000000fef8de58,0x00000000ff600000)
Metaspace used 2593K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 286K, capacity 386K, committed 512K, reserved 1048576K

上面的就是生成的GC日志,其中:

前两行是虚拟机的一些信息,如使用的是HotSpot虚拟机,JRE版本等;第三行是刚才配置的参数信息,真正的GC信息是第4、5行,所以这里直接将4、5两行单独拿出来进行分析:

0.121: [GC (System.gc()) [PSYoungGen: 4219K->680K(9216K)] 4219K->3760K(19456K), 0.0024028 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.124: [Full GC (System.gc()) [PSYoungGen: 680K->0K(9216K)] [ParOldGen: 3080K->3639K(10240K)] 3760K->3639K(19456K), [Metaspace: 2587K->2587K(1056768K)], 0.0062622 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]

1)最前面的数字0.121、0.124代表了GC发生的时间,这个数字的含义是从JAVA虚拟机启动以来经过的秒数;

2)GC日志开头的“[GC”和“[Full GC”说明了这次垃圾收集的停顿类型,而不是用来区分新生代GC还是老年代GC。如果有"Full",说明这次GC是发生了Stop-The-World的,就是指在执行GC操作的时候,会停止掉当前正在进行的其他线程,有一种“这是我的地盘,你们都给我让开”的霸道有木有?如果是调用System.gc()的方法所触发的收集,将会显示“Full GC(System.gc)",本文的例子就是使用System.gc()进行的收集;

3)接下来的"[PSYoungGen"、“[ParOldGen”、“[Metaspace“标示GC发生的区域,这里显示的区域名称与所使用的GC收集器密切相关(以后会对垃圾收集器进行详细介绍),下面是常见收集器所代表的的区域名称:

1>如果使用的是Serial(串行)收集器,新生代名为Default New Generation ,显示就是DefNew

2>如果使用的是ParNew(并行)收集器,新生代名称就会变为[Parnew,意思为Parallel New Generation

3>如果采用的是Parallel Scavenge收集器,新生代名称为PSYongGen

老年代和永久代同理,名称由垃圾收集器决定

如上面的日志中新生代名称为[PSYoungGen,使用的是Parallel Scavenge收集器;老年代名称为[ParOldGen,使用的是Paralled Old收集器(Parallel Scavenge收集器的老年代版本),还有元空间区域,有些文章中使用的是”[PermGen“,这时jdk8之前的版本,由于我使用的是jdk8,所以已经被”[Metaspace“所代替,至于为什么被代替,可以参考篇文章:https://blog.csdn.net/zhushuai1221/article/details/52122880

4)每个区域冒号后面,中括号内部的”680K->0K(9216K)]“含义是”GC前该内存区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)“。而在方括号之外的”3760K->3639K(19456K)“表示的是"GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆总容量)"

5)再往后 0.0062622 secs表示该内存区域GC所占用的时间单位是秒,有的收集器会给出具体的时间,如本例中的”[Times: user=0.06 sys=0.00, real=0.01 secs]“,这里面的user、sys、real与Linux命令所输出的时间含义一直,分别代表用户态消耗的CPU时间、内核态消耗的CPU时间和操作从开始到结束所经过的墙钟时间(Wall Clock Time)

TIPS:墙钟时间与CPU时间的区别是,墙钟时间包括各种非运算的等待耗时,例如等待磁盘的IO、等待线程阻塞;而CPU时间不包括这些耗时,但当系统中有对CPU或者多核的话,多线程操作会叠加这些CPU时间,所以读者看到user或sys的时间超过real时间是完全正常的。

上面对GC日志中各从参数的介绍摘自《深入理解Java虚拟机(第二版)》

再往下看,从第6行开始到结束的内容是各内存区域容量的变化情况!

备注:以上内容来源于《深入理解Java虚拟机》,根据自己的理解来总结,有些内容和书本内容相同是因为只有这么描述才比较好懂,毕竟大神还是大神,是颜色不一样的烟火!!

Java虚拟机系列(四)---查看GC日志的更多相关文章

  1. Java虚拟机系列——检视阅读

    Java虚拟机系列--检视阅读 参考 java虚拟机系列 入门掌握JVM所有知识点 2020重新出发,JAVA高级,JVM JVM基础系列 从 0 开始带你成为JVM实战高手 Java虚拟机-垃圾收集 ...

  2. 【java虚拟机系列】java虚拟机系列之JVM总述

    我们知道java之所以能够快速崛起一个重要的原因就是其跨平台性,而跨平台就是通过java虚拟机来完成的,java虚拟机属于java底层的知识范畴,即使你不了解也不会影响绝大部分人从事的java应用层的 ...

  3. 罗汉果与Java虚拟机系列目录与说明

    声    明 罗汉果与Java虚拟机系列博文仅为本银结构性整合Java虚拟机知识的笔记和日常JVM问题的DEBUG记录.放到网上主要是为了方便自己今后查看.顺带能帮助到别人就更奈斯了. 目    录 ...

  4. 自制Java虚拟机(四)-对象、new、invokespecial

    自制Java虚拟机(四)-对象.new.invokespecial 一.对象的表示 刚开始学Java的时候,图书馆各种教程,书名往往都是“Java面向对象高级编程”,通常作者都会与C++做个比较,列出 ...

  5. Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

    前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...

  6. 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性

    我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...

  7. Java虚拟机系列(五)---垃圾收集(GC)

    Java语言最大的优势除了它的平台无关性之外,还有它的自动内存分配和垃圾收集技术,本节我先来总结一下垃圾收集相关的内容.本文将从解答以下三个问题的角度来展开: 1.哪些内存需要回收? 2.什么时候回收 ...

  8. 深入理解JAVA虚拟机(内存模型+GC算法+JVM调优)

    目录 1.Java虚拟机内存模型 1.1 程序计数器 1.2 Java虚拟机栈 局部变量 1.3 本地方法栈 1.4 Java堆 1.5 方法区(永久区.元空间) 附图 2.JVM内存分配参数 2.1 ...

  9. 谈谈如何来查看GC日志

    一.首先来看一下JVM中的GC有哪几种类型? 1.-XX:UseSerialGC 虚拟机运行在Client模式的默认值,打开此开关参数后,使用Serial+Serial Old收集器组合进行垃圾收集. ...

随机推荐

  1. servlet的抽取

    servlet的抽取 servlet按照模块来划分,比如注册和登录的servlet就放到user的servlet中 原来: 登录时登录的servlet 注册时注册的servlet 现在: 登录注册的s ...

  2. Ubuntu Error: No module named 'apt_pkg' 怎么办?

    版权声明:任何博客都可以转载,但必须标注来源 https://blog.csdn.net/nikoong/article/details/79612615 ubuntu经常用要添加PPA源,就是使用如 ...

  3. C# EF去除重复列DistinctBy

    在网上看了LinQ有DistinctBy方法,实际在用的时候并没有找到,后来参照了该网站才发现写的是拓展方法 https://blog.csdn.net/c1113072394/article/det ...

  4. Parted:2T以上磁盘分区工具(LINUX挂载2T以上磁盘)

    支持大于2T的磁盘,2T以下的最好还是用Fdisk来分区. [root@centos57 aixi]# parted /dev/hda print Model: VMware Virtual IDE ...

  5. [Luogu2135] 方块消除【区间Dp】

    Online Judge:P2135 方块消除(这题不用预处理) Label:区间Dp 题目描述 Jimmy最近迷上了一款叫做方块消除的游戏.游戏规则如下:n个带颜色方格排成一列,相同颜色的方块连成一 ...

  6. 《OpenCV3编程入门》 札记

    图像处理和计算机视觉的区别在于: 图像处理侧重于 "处理"图像 --- 如增强,还原,去噪,分割,等等:而计算机视觉重点在于使用计算机(也许是可移动式的)来模拟人的视觉,因此模拟菜 ...

  7. 制作windows10系统启动U盘,从零开始。

    1.打开百度,搜索windows下载,选个这个点击进去. 2.会看到下图,然后点击立即下载工具按钮. 3.接下来由于网络的原因,可能需要漫长的等待.会下载一个MediaCreationTool1903 ...

  8. soj98 卡牌

    题意:一共有n张牌,每张牌有三个属性ai,bi,ci.问在属性上限为A,B,C的所有牌中有多少张牌满足至少有两个属性可以完全压制(严格大于)那n张牌? n<=50W. 标程: #include& ...

  9. [转]async & await 的前世今生(Updated)

    async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...

  10. CodeForces - 27E

    https://vjudge.net/problem/CodeForces-27E 求因子个数为n的最小的数dfs枚举质因子的幂 #include <iostream> #include ...