讲讲java的内存分析

讲讲java的内存分析

💡 原文中文,约1700字,阅读约需4分钟。
📝

内容提要

JDK 提供多种工具监控 JVM,如 `jconsole` 和 `jvisualvm`,推荐使用 `mat` 进行内存分析。JVM 调优不如代码审查和升级 JVM 有效。当内存占用过高或出现 OOM 时,可设置参数转储堆栈,利用 `mat` 的 `dominator tree` 分析内存分布,找出高内存占用的代码。`shallow heap` 计算对象本身的内存,`retained heap` 则递归显示对象及其子对象的内存占用,便于分析。

🎯

关键要点

  • JDK 提供多种工具监控 JVM,如 jconsole 和 jvisualvm,推荐使用 mat 进行内存分析。
  • JVM 调优不如代码审查和升级 JVM 有效,建议在内存占用过高或出现 OOM 时进行分析。
  • 可以设置参数转储堆栈,利用 mat 的 dominator tree 分析内存分布,找出高内存占用的代码。
  • shallow heap 计算对象本身的内存,retained heap 递归显示对象及其子对象的内存占用,便于分析。
  • mat 工具能够递归式获得对象占用的所有内存,包含子对象的占用,适合进行深入分析。
  • Heap Dump 仅涉及 Heap 区,Java 还有 Non-heap 区,分析 Non-heap 区的内存较为复杂。

延伸问答

如何使用 JDK 工具监控 JVM 的内存?

可以使用 JDK 自带的工具如 jconsole 和 jvisualvm,推荐使用 mat 进行内存分析。

当 JVM 出现 OOM 时应该如何处理?

可以设置参数转储堆栈,使用 -XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath 进行内存转储。

什么是 dominator tree,如何使用它分析内存?

dominator tree 是一种工具,可以显示内存占用的分布,帮助找出高内存占用的代码。

shallow heap 和 retained heap 有什么区别?

shallow heap 计算对象本身的内存,而 retained heap 递归显示对象及其子对象的内存占用。

为什么 JVM 调优不如代码审查和升级有效?

因为 JVM 默认运行就好,更多问题出在代码层面,审查代码或升级 JVM 能带来更大提升。

Heap Dump 和 Non-heap 区的分析有什么不同?

Heap Dump 仅涉及 Heap 区,而 Non-heap 区分析较为复杂,通常存储类的元数据等。

🏷️

标签

➡️

继续阅读