GC日志分析

2023-11-09

JVM的GC日志的主要参数包括如下几个:

-XX:+PrintGC 输出GC日志

-XX:+PrintGCDetails 输出GC的详细日志

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

-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)

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

-Xloggc:../logs/gc.log 日志文件的输出路径

在我做了如下的设置

Java代码   收藏代码
  1. -XX:+PrintGCDetails -Xloggc:../logs/gc.log -XX:+PrintGCTimeStamps  

 

以后打印出来的日志为:

Java代码   收藏代码
  1. 0.756: [Full GC (System) 0.756: [CMS: 0K->1696K(204800K), 0.0347096 secs] 11488K->1696K(252608K), [CMS Perm : 10328K->10320K(131072K)], 0.0347949 secs] [Times: user=0.06 sys=0.00, real=0.05 secs]  
  2. 1.728: [GC 1.728: [ParNew: 38272K->2323K(47808K), 0.0092276 secs] 39968K->4019K(252608K), 0.0093169 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]  
  3. 2.642: [GC 2.643: [ParNew: 40595K->3685K(47808K), 0.0075343 secs] 42291K->5381K(252608K), 0.0075972 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]  
  4. 4.349: [GC 4.349: [ParNew: 41957K->5024K(47808K), 0.0106558 secs] 43653K->6720K(252608K), 0.0107390 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]  
  5. 5.617: [GC 5.617: [ParNew: 43296K->7006K(47808K), 0.0136826 secs] 44992K->8702K(252608K), 0.0137904 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]  
  6. 7.429: [GC 7.429: [ParNew: 45278K->6723K(47808K), 0.0251993 secs] 46974K->10551K(252608K), 0.0252421 secs]  

 

我们取倒数第二条记录分析一下各个字段都代表了什么含义

Java代码   收藏代码
  1. 5.617(时间戳): [GC(Young GC) 5.617(时间戳): [ParNew(使用ParNew作为年轻代的垃圾回收期): 43296K(年轻代垃圾回收前的大小)->7006K(年轻代垃圾回收以后的大小)(47808K)(年轻代的总大小), 0.0136826 secs(回收时间)] 44992K(堆区垃圾回收前的大小)->8702K(堆区垃圾回收后的大小)(252608K)(堆区总大小), 0.0137904 secs(回收时间)] [Times: user=0.03(Young GC用户耗时) sys=0.00(Young GC系统耗时), real=0.02 secs(Young GC实际耗时)]  

 

我们再对数据做一个简单的分析

从最后一条GC记录中我们可以看到 Young GC回收了 45278-6723=38555K的内存

Heap区通过这次回收总共减少了 46974-10551=36423K的内存。

38555-36423=2132K说明通过该次Young GC有2132K的内存被移动到了Old Gen,

 

我们来验证一下

在最后一次Young GC的回收以前 Old Gen的大小为8702-7006=1696

回收以后Old Gen的内存使用为10551-6723=3828

Old Gen在该次Young GC以后内存增加了3828-1696=2132K 与预计的相符

 

重新设置GC日志的输出

 

Java代码   收藏代码
  1. -XX:+PrintGCDetails  
  2. -XX:+PrintHeapAtGC  
  3. -XX:+PrintGCDateStamps  
  4. -XX:+PrintTenuringDistribution  
  5. -verbose:gc  
  6. -Xloggc:gc.log  

后可以看到进行GC前后的堆内存信息 

Java代码   收藏代码
  1. {Heap before GC invocations=1 (full 0):  
  2.  PSYoungGen      total 152896K, used 131072K [0x00000000f55600000x00000001000000000x0000000100000000)  
  3.   eden space 131072K, 100% used [0x00000000f5560000,0x00000000fd560000,0x00000000fd560000)  
  4.   from space 21824K, 0% used [0x00000000feab0000,0x00000000feab0000,0x0000000100000000)  
  5.   to   space 21824K, 0% used [0x00000000fd560000,0x00000000fd560000,0x00000000feab0000)  
  6.  PSOldGen        total 349568K, used 0K [0x00000000e00000000x00000000f55600000x00000000f5560000)  
  7.   object space 349568K, 0% used [0x00000000e0000000,0x00000000e0000000,0x00000000f5560000)  
  8.  PSPermGen       total 26432K, used 26393K [0x00000000d00000000x00000000d19d00000x00000000e0000000)  
  9.   object space 26432K, 99% used [0x00000000d0000000,0x00000000d19c64a0,0x00000000d19d0000)  
  10. 2013-05-05T23:16:10.480+08005.228: [GC  
  11. Desired survivor size 22347776 bytes, new threshold 7 (max 15)  
  12.  [PSYoungGen: 131072K->8319K(152896K)] 131072K->8319K(502464K), 0.0176346 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]   
  13. Heap after GC invocations=1 (full 0):  
  14.  PSYoungGen      total 152896K, used 8319K [0x00000000f55600000x00000001000000000x0000000100000000)  
  15.   eden space 131072K, 0% used [0x00000000f5560000,0x00000000f5560000,0x00000000fd560000)  
  16.   from space 21824K, 38% used [0x00000000fd560000,0x00000000fdd7ff78,0x00000000feab0000)  
  17.   to   space 21824K, 0% used [0x00000000feab0000,0x00000000feab0000,0x0000000100000000)  
  18.  PSOldGen        total 349568K, used 0K [0x00000000e00000000x00000000f55600000x00000000f5560000)  
  19.   object space 349568K, 0% used [0x00000000e0000000,0x00000000e0000000,0x00000000f5560000)  
  20.  PSPermGen       total 26432K, used 26393K [0x00000000d00000000x00000000d19d00000x00000000e0000000)  
  21.   object space 26432K, 99% used [0x00000000d0000000,0x00000000d19c64a0,0x00000000d19d0000)  
  22. }  

 

Java代码   收藏代码
  1. [0x00000000f5560000,0x00000000f5560000,0x00000000fd560000)  

这种形式的日志有两种意义: 
当这种日志出现在generation的详细信息里的时候,三个数字在HotSpot里分别称为low_boundary、high、high_boundary。 
low_boundary: reserved space的最低地址边界;通常也跟“low”相等,这是commited space的最低地址边界 
high: commited space的最高地址边界 
high_boundary: reserved space的最高地址边界。 

[low_boundary, high_boundary)范围内的就是reserved space,这个space的大小就是max capacity。 
[low, high)范围内的就是commited space,而这个space的大小就是current capacity(当前容量),简称capacity。 
capacity有可能在一对最小值和最大值之间浮动。最大值就是上面说的max capacity。 


转载地址:http://swcdxd.iteye.com/blog/1859858

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GC日志分析 的相关文章

  • 如何在JVM不退出的情况下多次运行Java程序?

    假设我有一个Java程序Test class 如果我使用下面的脚本 for i in 1 10 do java Test done JVM每次都会退出java Test被调用 我想要的是跑步java Test在不退出JVM的情况下多次执行
  • 使用 + 符号连接字符串

    今天我在读书Antonio 关于 toString 性能的博客 https antoniogoncalves org 2015 06 30 who cares about tostring performance 还有一段话 昨天曾经被认为
  • 最近有关于 JVM 的书吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何减少Scala中创建的对象数量?

    我正在 Scala 中编写一个计算机图形应用程序 它使用 RGB 类返回图像中某个点的颜色 正如你可以想象的 返回颜色 RGB 对象的函数被调用了很多次 class RGB val red Int val green Int val blu
  • 什么触发了java垃圾收集器

    我对 Java 中垃圾收集的工作原理有点困惑 我知道当不再有对某个对象的实时引用时 该对象就有资格进行垃圾回收 但是如果它有对实时对象的引用怎么办 可以说我有一个节点集合 它们再次引用更多节点 List 1 gt Node a gt Nod
  • 在intellij中为java启用ssl调试

    从我的问题开始 上一期尝试通过 tls ssl 发送 java 邮件 https stackoverflow com questions 39259578 javamail gmail issue ready to start tls th
  • 一个好的 Java VM 中方法调用的开销是多少?

    有人可以提供反汇编的机器代码汇编程序列表吗 我的意思是 与 C 中的普通函数调用相比 肯定有一些开销 VM 需要跟踪调用以查找热点 并且当它使用编译代码时 如果新加载的类需要重新编译 它需要提供动态更改编译方法的方法 我想某处也有返回堆栈溢
  • Scala 中的多个类型下限

    我注意到tuple productIterator总是返回一个Iterator Any 想知道是否无法设置多个下限 因此它可能是最低公共超类型的迭代器 我尝试并搜索了一下 但只发现this https stackoverflow com q
  • 如何判断我是在 64 位 JVM 还是 32 位 JVM 中运行(在程序内)?

    如何判断应用程序运行的 JVM 是 32 位还是 64 位 具体来说 我可以使用哪些函数或属性来在程序中检测到这一点 对于某些版本的 Java 您可以使用标志从命令行检查 JVM 的位数 d32 and d64 java help d32
  • 可以混合使用 JVM 语言吗?即:Groovy 和 Clojure

    我知道你可以轻松地混合groovy java clojure java 无论什么JvmLang java 这是否也意味着我也可以让 clojure 和 groovy 代码进行交互 如果我使用 Grails 或 jRoR 我也可以在该环境中使
  • 使用 javac 和 javax.tools.JavaCompiler 有什么区别?

    Maven 编译器插件文档states http maven apache org plugins maven compiler plugin 编译器插件用于编译项目的源代码 从 3 0 开始 默认编译器是 javax tools Java
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • OpenJDK 源代码中如何以及在何处解释分配堆内存?

    我正在尝试更改我的研究项目的 OpenJDK 源代码 我想知道在 Java 程序中调用 new 运算符时的代码流程 class MyFirstProgram public static void main String args throw
  • 如何在没有 Node.JS 的情况下运行 UglifyJS2

    无论如何都要跑UglifyJS2 https github com mishoo UglifyJS2没有node js 假设我想使用 JavaScript 脚本引擎在 JVM 进程中运行它 怎么做 我看到米秀回答你了https github
  • JVM锯齿状空闲进程

    我目前正在进行一项涉及 JVM 及其内存使用工作原理的研究 我不明白的是 JVM在空闲时用什么填充它的内存 只是为了在堆几乎达到时释放它 为什么使用的内存不只有一条平线 顺便说一句 这个 java 应用程序托管在 glassfish 上 但
  • Java:为什么.class文件中的方法类型包含返回类型,而不仅仅是签名?

    class 文件的常量池中有一个 NameAndType 结构 它用于动态绑定 该类可以 导出 的所有方法都被描述为 签名 返回类型 喜欢 getVector Ljava util Vector 当某些 jar 中方法的返回类型发生更改时
  • JVM GC 是否会在引用比较过程中移动对象,导致即使双方都引用同一个对象,比较也会失败?

    众所周知 GC 有时会在内存中移动对象 据我了解 只要在移动对象时 调用任何用户代码之前 更新所有引用 这应该是完全安全的 但是 我看到有人提到引用比较可能不安全 因为对象在引用比较过程中被 GC 移动 这样即使两个引用应该引用同一个对象
  • 是否可以强制 JVM 在堆中而不是堆中创建对象?

    我读过一些文章 有时JVM会识别一些对象并尝试在堆栈中而不是堆中创建它 因为堆栈上的内存分配比堆中的内存分配便宜 堆栈上的释放是免费的 并且堆栈由以下方式有效管理 运行时 那么 堆栈中的对象分配是如何工作的 有什么方法可以强制 JVM 执行
  • 有没有一种独立的JAVA可以在PC上运行而无需任何操作系统

    据我所知 java 程序可以在任何操作系统上运行 任何类型的机器都有 JVM 我需要一个在我的 PC 上独立运行的 JVM 而不是在我的操作系统 Windows 或任何其他操作系统 上运行 我的意思是 JVM 的作用类似于启动 而不是操作系

随机推荐

  • 您的嵌入式开发团队的静态代码分析工具是什么? 这份指南你一定需要

    所有的静态分析工具从50 000英尺高空看去往往都是一样的 当计划部署静态分析时 重要的是选择一个适合组织需求的解决方案 并能随着未来的需求而增长 一个工具应该具备的特点和能力可以分成两组 第一组是常见的 预期的技术功能 如支持的语言 ID
  • 波形失真总结

    失真是输入信号与输出信号在幅度比例关系 相位关系及波形形状产生变化的现象 音频功放的失真分为电失真和声失真两大类 电失真是由电路引起的 声失真是由还音器件扬声器引起的 电失真的类型有 谐波失真 互调失真 瞬态失真 声失真主要是交流接口失真
  • QApplication、QGuiApplication和QCoreApplication三者的区别与联系

    为什么80 的码农都做不了架构师 gt gt gt 从继承关系看 QApplication父类是QGuiApplication QGuiApplication父类是QCoreApplication 开发的应用无图像界面 就使用QCoreAp
  • Ant Trip 【HDU - 3018】【欧拉通路一笔画问题】

    题目链接 欧拉通路与欧拉回路不同 欧拉通路其实不强制要求走回 也就是不要求最后从哪开始 然后再回到哪 这道题 是问的我们需要走几次一笔画 那么 很显然 考虑入度出度以及连通性 在同一个联通块中 我们可以拆分成如下几种可能 形成闭环 无奇数度
  • REST API 最佳入门指南

    点击上方 程序员大咖 选择 置顶公众号 关键时刻 第一时间送达 如果你看到这里 你以前可能听说过API 和REST 然后你就会想 这些都是什么东西 也许你已经了解过一些这方面的知识 但却不知道从何入手 在这个教程中 我将会诠释REST的基础
  • create umi创建项目

    1 环境准备 安装node node确保它是 8 10 或更高版本 node v v14 17 0 安装yarn 推荐用于yarn管理 npm 依赖 npm install g yarn gt yarn 1 22 10 preinstall
  • keepalived工作原理和配置说明

    keepalived是什么 keepalived是集群管理中保证集群高可用的一个服务软件 其功能类似于heartbeat 用来防止单点故障 keepalived工作原理 keepalived是以VRRP协议为实现基础的 VRRP全称Virt
  • 斗智斗勇 -- 谷歌浏览器的主页被篡改

    不知道从什么时候开始 每次我打开谷歌浏览器 都会跳出2345网址导航 界面花里胡哨的 今天实在是忍无可忍了 就对他动手了 百度了半天 又是禁服务 又是删注册表的 一直然并软 最后实在没办法 只能装个电脑管家试试了 解决完问题再卸载吧 安装好
  • 在rdesktop 远程时报如下错误Autoselecting keyboard map ‘en-us‘ from localeCore(warning): Certificate received

    在rdesktop 时报如下错误 Autoselecting keyboard map en us from locale Core warning Certificate received from server is NOT trust
  • IT项目管理第七次作业

    完成作业1 3的要求 使用 project 或其他项目管理工具 1 假设 每项工作的单位小时成本数如下表 项目经理单位小时成本为100 项目团队成员单位小时成本为60 WBS条目 小时数 单位小时成本 美元 子层总合 美元 WBS第二层的总
  • java 内存溢出 扩大jvm内存

    随手小记 今天下午遇到一个问题 java lang OutOfMemoryError Java heap space 内存溢出问题 遇到这个问题一般有两个解决方式 第一种 修改代码程序 代码中存在大量未被释放的对象引用 或者gc 机制没有来
  • 全排列 Ⅱ--回溯算法

    LeetCode 全排列 给定一个可包含重复数字的序列 返回所有不重复的全排列 示例 输入 1 1 2 输出 1 1 2 1 2 1 2 1 1 解法 回溯法 解题思路 思路很简单 因为要全排列 所以每一个数字都可能选择 即选择区间为 0
  • 最新版Bootstrap5教程——Bootstrap5基础

    个人主页 这个昵称我想了20分钟 往期专栏 速成之路 jQuery 速成之路 SQLserver 速成之路 Ajax 系列专栏 最新Bootstrap5教程 Bootstrap5 Bootstrap5简介 Bootstrap5下载 Boot
  • Linux下shell脚本实战之批量新建用户

    Linux下shell脚本实战之批量新建用户 一 脚本要求 二 脚本内容 三 运行脚本 一 脚本要求 二 脚本内容 三 运行脚本 一 脚本要求 1 使用提供的user txt用户列表 2 批量新建user txt中用户 二 脚本内容 1 查
  • java 简单 数组 自然合并排序

    题目 对所给元素存储于数组中或链表中 选择一种情形 写出自然合并排序算法 结果演示 基本思想 自然排序是在合并排序的基础上修改而成 合并排序 给出一个n个元素无序的整数数组 将其一分为2 则一个子集为n 2 再将子集划分为2 不断划分直到只
  • 电赛控制-----经验分享

    1 赛前准备 先简单介绍一下电赛 电赛是两年一届 单数年是大电赛 全称是全国大学生电子设计大赛 之前由瑞萨电子赞助 所以之前也叫瑞萨杯 从19年开始赞助方变成了TI公司 偶数年是小电赛 全称是 TI杯 模电邀请赛 这里不得不提TI公司的实力
  • json库报错(TypeError: the JSON object must be str, bytes or bytearray, not TextIOWrapper)

    使用json库导入json文件时 报错 TypeError the JSON object must be str bytes or bytearray not TextIOWrapper import json f open data d
  • 学习TensorFlow,调用预训练好的网络(Alex, VGG, ResNet etc)

    视觉问题引入深度神经网络后 针对端对端的训练和预测网络 可以看是特征的表达和任务的决策问题 分类 回归等 当我们自己的训练数据量过小时 往往借助牛人已经预训练好的网络进行特征的提取 然后在后面加上自己特定任务的网络进行调优 目前 ILSVR
  • oracle12542,关于客户端报的ORA-12542

    最近用户一个小应用系统总是出故障 windows的系统上跑一个VB写的小客户端程序 出现问题的时候 系统会弹出以下信息 Microsoft ODBC driver for oracle ORA 12542 TNS address alrea
  • GC日志分析

    JVM的GC日志的主要参数包括如下几个 XX PrintGC 输出GC日志 XX PrintGCDetails 输出GC的详细日志 XX PrintGCTimeStamps 输出GC的时间戳 以基准时间的形式 XX PrintGCDateS