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

时间:2016-02-03 19:48:32

标签: memory-management jvm java-8

我正在尝试用实际方法测量我的应用程序内存占用量。 我正在使用java.lang.management类来计算这个

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

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

所以我想知道我错过了什么?除了获取应用程序的总内存使用量之外,我还需要添加到此等式中。

1 个答案:

答案 0 :(得分:10)

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

请注意,应用程序足迹是一个不同的概念。从JVM的角度来看 Java应用程序占用空间大致是Java对象占用的空间量(Heap) 和Java类(非堆)。从操作系统的角度来看,还有很多东西可以计算, 包括JVM本身和使您的应用程序工作的Java Runtime的所有组件。

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

  • Java Heap;
  • Metaspace(用于类元数据);
  • 代码缓存(JIT编译方法和所有生成代码的位置);
  • Direct ByteBuffers;
  • 内存映射文件,包括由JVM映射的文件,例如类路径上的所有JAR文件;
  • 线程堆栈;
  • JVM代码本身以及Java Runtime加载的所有动态库;
  • 许多其他内部JVM结构。