icode icode
首页
  • Android学习

    • 📁基础内容
    • 📺AndroidCore
    • 🎨Android-UI
    • 🏖️Components
    • 📊Fragment
    • 🔗网络操作
    • 🔏异步机制
    • 📦数据存储
    • 🗃️Gradle
  • 学习笔记

    • 『框架』笔记
    • 『Kotlin』笔记
    • 《Vue》笔记
    • 《Git》学习笔记
    • 『Bug踩坑记录』
  • ListView
  • RecyclerView
  • ViewPager
  • Java笔记

    • 🟠JavaSE
    • 🟢JavaWeb
    • 🔴JavaEE
    • ⚪JavaTopic
    • 🍳设计模式
  • 计算机基础

    • 📌计算机网络
    • 🔍数据结构
    • 📦数据库
    • 💻OS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 关于

    • 📫关于我
  • 收藏

    • 网站
    • 资源
    • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

iqqcode

保持对技术的探索实践与热爱
首页
  • Android学习

    • 📁基础内容
    • 📺AndroidCore
    • 🎨Android-UI
    • 🏖️Components
    • 📊Fragment
    • 🔗网络操作
    • 🔏异步机制
    • 📦数据存储
    • 🗃️Gradle
  • 学习笔记

    • 『框架』笔记
    • 『Kotlin』笔记
    • 《Vue》笔记
    • 《Git》学习笔记
    • 『Bug踩坑记录』
  • ListView
  • RecyclerView
  • ViewPager
  • Java笔记

    • 🟠JavaSE
    • 🟢JavaWeb
    • 🔴JavaEE
    • ⚪JavaTopic
    • 🍳设计模式
  • 计算机基础

    • 📌计算机网络
    • 🔍数据结构
    • 📦数据库
    • 💻OS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 关于

    • 📫关于我
  • 收藏

    • 网站
    • 资源
    • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • JavaSE

    • 面向对象

    • 常用API

    • 集合类

    • 多线程

    • JDK8新特性

    • IO流

    • JVM

      • 类加载系统
      • 运行时数据区及线程
      • 程序计数器
      • 虚拟机栈
      • 本地方法栈
      • 堆
      • 方法区
      • 对象实例化的内存布局与访问定位
      • 面试考点
      • 垃圾回收算法
      • 执行引擎
      • 垃圾回收相关概念
      • 垃圾回收算法
      • 垃圾回收器
      • GC日志分析
        • GC日志参数分析
        • 日志分析工具
      • JVM内存区域与内存溢出异常
      • JVM垃圾回收器与内存分配策略
      • Java内存模型JMM详解
      • StringTable详解
      • 站在虚拟机栈的角度,用字节码来理解i++和++i
  • JavaWeb

  • JavaEE

  • JavaTopic

  • 设计模式

  • 计算机基础

  • Java后端
  • JavaSE
  • JVM
iqqcode
2021-06-17
目录

GC日志分析

# GC日志参数分析

public class _01PrintGCDetails {
    public static void main(String[] args) {
        ArrayList<byte[]> list = new ArrayList<>();
        for (int i = 0; i < 500; i++) {
            byte[] arr = new byte[1024 * 1024];
            list.add(arr);
        }
    }
}
1
2
3
4
5
6
7
8
9

[GC (Allocation Failure) [DefNew: 3843K->512K(4928K), 0.0034569 secs] 3843K->2649K(15872K), 0.0043457 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 4738K->0K(4928K), 0.0038790 secs] 6875K->6745K(15872K), 0.0039024 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 4205K->0K(4928K), 0.0024967 secs] 10950K->10841K(15872K), 0.0025230 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 4220K->1K(4928K), 0.0038292 secs][Tenured: 14937K->14938K(15056K), 0.0015664 secs] 15061K->14938K(19984K), [Metaspace: 2252K->2252K(4480K)], 0.0055458 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 9435K->1027K(11264K), 0.0091230 secs] 24374K->24158K(36164K), 0.0091612 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 10447K->1024K(11264K), 0.0075598 secs][Tenured: 32350K->32350K(33124K), 0.0017955 secs] 33578K->33374K(44388K), [Metaspace: 2279K->2279K(4480K)], 0.0095590 secs] [Times: user=0.00 sys=0.01, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 21373K->2072K(24320K), 0.0132403 secs] 53724K->52855K(78240K), 0.0132947 secs] [Times: user=0.00 sys=0.02, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 22954K->2048K(24320K), 0.0126333 secs][Tenured: 71288K->71288K(71396K), 0.0020584 secs] 73738K->73336K(95716K), [Metaspace: 2283K->2283K(4480K)], 0.0150118 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 46984K->5120K(53568K), 0.0272463 secs] 118272K->117369K(172384K), 0.0273079 secs] [Times: user=0.02 sys=0.01, real=0.03 secs] 
[GC (Allocation Failure) [DefNew: 52101K->5120K(53568K), 0.0294453 secs][Tenured: 158330K->158302K(158908K), 0.0266126 secs] 164350K->163422K(212476K), [Metaspace: 2283K->2283K(4480K)], 0.0563373 secs] [Times: user=0.05 sys=0.02, real=0.06 secs] 
[GC (Allocation Failure) [DefNew: 69947K->69947K(78656K), 0.0000182 secs][Tenured: 158302K->174687K(174784K), 0.0243151 secs] 228249K->227936K(253440K), [Metaspace: 2283K->2283K(4480K)], 0.0243971 secs] [Times: user=0.03 sys=0.00, real=0.03 secs] 
[Full GC (Allocation Failure) [Tenured: 174687K->174687K(174784K), 0.0027962 secs] 252803K->252513K(253440K), [Metaspace: 2283K->2283K(4480K)], 0.0028338 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [Tenured: 174687K->174670K(174784K), 0.0309642 secs] 252513K->252496K(253440K), [Metaspace: 2283K->2283K(4480K)], 0.0310148 secs] [Times: user=0.03 sys=0.00, real=0.03 secs] 
Heap
 def new generation   total 78656K, used 78148K [0x05600000, 0x0ab50000, 0x0ab50000)
  eden space 69952K, 100% used [0x05600000, 0x09a50000, 0x09a50000)
  from space 8704K,  94% used [0x09a50000, 0x0a251168, 0x0a2d0000)
  to   space 8704K,   0% used [0x0a2d0000, 0x0a2d0000, 0x0ab50000)
 tenured generation   total 174784K, used 174670K [0x0ab50000, 0x15600000, 0x15600000)
   the space 174784K,  99% used [0x0ab50000, 0x155e3850, 0x155e3a00, 0x15600000)
 Metaspace       used 2303K, capacity 2344K, committed 2368K, reserved 4480K
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at gc.logs._01PrintGCDetails.main(_01PrintGCDetails.java:14)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

【参数解析】

  • GC、Full GC: GC的类型

    • GC只在新生代上进行

    • Full GC包括永久代(元空间),新生代, 老年代

  • Allocation Failure: GC发生的原因,即内存分配失败

  • 21373K->2072K:堆在GC前的使用大小和GC后的使用大小

  • 78656K:堆空间的总大小

  • 0.0273079 secs: GC耗时

  • PSYoungGen:表示当前使用了Parallel Scavenge并行垃圾收集器进行新生代回收

  • ParOldGen:表示当前使用了Parallel Old并行垃圾收集器进行老年代回收

  • Metaspace: 元数据区GC前后大小的变化,JDK1.8中引入了元数据区以替代永久代

  • Times: user: 指的是垃圾收集器花费的所有CPU时间,sys:花费在等待系统调用或系统事件的时间,real:GC从开始到结束的时间,包括其他进程占用时间片的实际时间

  • Heap:整个堆内存的详细使用以及回收情况

【垃圾回收器说明】

  • Serial收集器在新生代的名字是De fault New Generation, 因此显示的是" DefNew"

  • ParNew收集器在新生代的名字会变成" ParNew",意思是"Parallel New Generation"

  • Parallel Scavenge收 集器在新生代的名字是" PSYoungGen"

  • G1收集器,会显示为"garbage-first heap"

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

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

# 日志分析工具

可以用一些工具去分析这些GC日志

常用的日志分析工具有:

GCVIewer、 GREasy、 GCHisto、 GCLogViewer、 Hp jmeter、 garbagecat等......

GReasy日志分析

👉GReasy (opens new window)

编辑 (opens new window)
上次更新: 2021/06/27, 10:49:09
垃圾回收器
JVM内存区域与内存溢出异常

← 垃圾回收器 JVM内存区域与内存溢出异常→

最近更新
01
匿名内部类
10-08
02
函数式接口
10-08
03
ARouter-Kotlin踩坑
10-05
更多文章>
Theme by Vdoing | Copyright © 2021-2023 iqqcode | MIT License | 备案号-京ICP备2021028793号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×