我们遇到了与内存相关的问题。
我们的监视器显示我们的服务正在消耗 800MiB 内存。
我们已经创建了一个堆转储。然而,这个堆转储告诉我们总堆大小是 41MiB。
Out 服务正在容器内运行。我们已经阅读了很多与 java 和 docker 容器相关的问题。不过,我们正在尝试获取更多信息。
我们怎样才能获得更多关于java vm的内存相关信息?
有什么想法吗?
最佳答案
堆转储报告的内存使用情况与外部监控报告的使用情况之间存在巨大差异可能是由于以下几个原因造成的。需要注意的一些事项包括:
JVM 的内存利用率不仅仅包含 Java 堆。它包括 JVM 可执行文件和共享库、元空间、 native (malloc) 堆以及保存线程堆栈的内存段。它还可能包括内存映射文件以及与其他进程共享的内存段。
Java堆使用的内存包括无法访问的对象以及当前未分配给对象的空间;即可用堆空间。
如何获得有关 Java 内存利用率的更多信息?
主要来源是"Java Platform, Standard Edition Troubleshooting Guide" :
- Native Memory Tracking部分介绍了如何使用
jcmd
来了解整体情况。 - JFR Memory Tab提供 Java 堆使用统计信息和 GC 的实时监控。
- Jmap Utility可用于获取堆和 GC 配置信息、堆直方图和类加载器统计信息。
- GC 日志记录可以提供有关 GC 行为的有用见解。
关于Java内存泄漏与堆转储信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59860298/