Java内存泄漏与堆转储信息

标签 java memory-leaks heap-memory

我们遇到了与内存相关的问题。

我们的监视器显示我们的服务正在消耗 800MiB 内存。

我们已经创建了一个堆转储。然而,这个堆转储告诉我们总堆大小是 41MiB。

enter image description here

Out 服务正在容器内运行。我们已经阅读了很多与 java 和 docker 容器相关的问题。不过,我们正在尝试获取更多信息。

我们怎样才能获得更多关于java vm的内存相关信息?

有什么想法吗?

最佳答案

堆转储报告的内存使用情况与外部监控报告的使用情况之间存在巨大差异可能是由于以下几个原因造成的。需要注意的一些事项包括:

  1. JVM 的内存利用率不仅仅包含 Java 堆。它包括 JVM 可执行文件和共享库、元空间、 native (malloc) 堆以及保存线程堆栈的内存段。它还可能包括内存映射文件以及与其他进程共享的内存段。

  2. 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/

相关文章:

c++:动态分配的 new 运算符是否检查内存安全?

java - 在后台线程中执行 OkHttp 网络操作

java - ClusterJ 在初始化域类型处理程序失败后删除架构

python - 在python中使用MySQLdb向数据库插入新元素时发生内存泄漏

c++ - 具有内存分配的函数中的C++析构函数静态变量

c++ - 为什么不分配内存就能正常工作

c++ - Linux 分配器不会释放小块内存

java - 如何从对象中调用变量?

java - 第一个 Imageviews 和原始重复和变化太快

multithreading - 使用线程和Tkinter时发生内存泄漏