以编程方式查找我的应用程序内存占用空间

Find my application memory foot print programmatically

我正在尝试实用地测量我的应用程序内存足迹。 我正在使用 java.lang.management class 来计算这个

val heap = ManagementFactory.getMemoryMXBean.getHeapMemoryUsage
val nonHeap = ManagementFactory.getMemoryMXBean.getNonHeapMemoryUsage
val total = heap + nonHeap + (?)

我假设两者的总和将给出应用程序使用的内存总量,但事实并非如此,top 命令提供的实际大小更大。

所以我想了解我错过了什么?为了得到我的应用程序的总内存使用量,我还需要向这个等式添加什么。

要查找 top 提供的内存使用情况,请检查进程的 OS 级统计信息。 在 Linux 上,您可以通过阅读 /proc/self/stat/proc/self/status 来完成此操作。 更多关于 proc pseudo-file system.

请注意,应用程序足迹 是一个不同的概念。从 JVM 的角度来看 Java 应用程序占用空间大致是 space 被 Java 对象占用的数量(堆) 和 Java classes(非堆)。从 OS 的角度来看,还有更多的事情要做, 包括 JVM 本身和 Java 使您的应用程序运行的运行时的所有组件。

整个Java进程使用的内存包括

  • Java堆;
  • Metaspace(对于 class 元数据);
  • 代码缓存(JIT 编译的方法和所有生成的代码的地方);
  • 直接字节缓冲区;
  • 内存映射文件,包括JVM映射的文件,例如class路径上的所有 JAR 文件;
  • 线程堆栈;
  • JVM 代码本身以及 Java 运行时加载的所有动态库;
  • 许多其他内部 JVM 结构。