这篇文章将为大家详细讲解有关Java中垃圾收集日志、线程转储、堆转储的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
Java 虚拟机 (JVM) 生成 3 个关键组件,这些组件对于优化性能和排除生产问题很有用。这些组件是:
垃圾收集 (GC) 日志
线程转储
堆转储
在本文中,让我们尝试了解这 3 个关键组件,它们在哪里使用,它的外观如何,如何捕获它们,如何分析它们以及它们的差异。
GC Log 包含垃圾收集事件相关信息。它将指示运行了多少 GC 事件,它们是什么类型的 GC 事件(即 Young GC 或 Full GC),每个 GC 事件暂停应用程序的时间,每个 GC 事件回收了多少对象。
可以在此处找到示例垃圾收集日志文件。
垃圾收集日志用于研究应用程序的 GC 和内存性能。它用于优化 GC 暂停时间,用于确定应用程序的最佳内存大小,还用于解决与内存相关的问题。
您可以通过传递以下 JVM 参数来生成垃圾收集日志:
对于 8 之前的 Java 版本:
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:<file-path>
对于从 9 开始的 Java 版本:
-Xlog:gc*:file=<file-path>
文件路径:是垃圾收集日志文件将被写入的位置。
垃圾收集日志格式因您的 JVM 供应商(Oracle、HP、IBM、Azul 等)、Java 版本(1.5、5、6、7、8、9、10、11、12……)、垃圾而异收集算法(串行、并行、CMS、G1、Shenandoah、Z GC)和传递的 JVM 参数。因此,没有一种可用的标准化格式。
有多种垃圾收集日志分析工具。这里给出了一些流行的:GCeasy、IBM GC 和内存可视化器、HP JMeter、Google Garbage Cat。
线程转储是某个时间点在应用程序中运行的所有线程的快照。它包含有关应用程序中每个线程的所有信息,例如:线程状态、线程 ID、本机 ID、线程名称、堆栈跟踪、优先级。
可以在此处找到示例线程转储。
线程转储主要用于解决生产问题,例如 CPU 峰值、应用程序无响应、响应时间差、线程挂起、内存消耗高。
可以使用8 个不同的选项从正在运行的应用程序中捕获线程转储。进行线程转储的最常见选项是使用“jstack”工具。jstack 工具在 JDK_HOME\bin 文件夹中提供。这是您需要发出以捕获线程转储的命令:
jstack -l <pid> > <file-path>
其中pid:是应用程序的进程ID,应捕获其线程转储,而file-path:是将写入线程转储的文件路径。
以下是使用最广泛的线程转储分析工具:fastThread
、Samurai
、IBM Thread & Monitor Analyzer
、Visual VM
。
堆转储是某个时间点应用程序内存的快照。它包含诸如内存中的对象是什么、它们携带什么值、它们的大小是多少、它们引用了哪些其他对象等信息。
可以在此处找到示例堆转储。(注意:它将采用二进制格式。因此您实际上无法读取它)。
堆转储主要用于解决内存相关的 OutOfMemoryError 问题。
可以使用7 个不同的选项从正在运行的应用程序中捕获堆转储。进行堆转储的最常见选项是使用“jmap”工具。jmap 工具在 JDK_HOME\bin 文件夹中提供。这是您需要发出以捕获的命令:
<span >jmap -dump:format=b,</span><span >
</span><span >file=<file-path> <pid> </span>
其中pid:是 Java 进程 ID,应捕获其堆转储,而file-path:是将写入堆转储的文件路径。
堆转储文件采用二进制格式,并且往往很大。除此之外,它们的格式严重缺乏文档。因此,您必须使用堆转储分析工具(在下一个问题中给出)来分析和理解它们。
使用最广泛的堆转储分析工具:Eclipse MAT
、HeapHero
、JVisualVM
。
关于“Java中垃圾收集日志、线程转储、堆转储的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。