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

Tom*_*mer 4 jvm memory-management java-8

我试图以务实的方式测量我的应用程序内存占用量.我正在使用java.lang.management类来计算它

val heap = ManagementFactory.getMemoryMXBean.getHeapMemoryUsage
val nonHeap = ManagementFactory.getMemoryMXBean.getNonHeapMemoryUsage
val total = heap + nonHeap + (?)
Run Code Online (Sandbox Code Playgroud)

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

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

apa*_*gin 11

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

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

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

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