Memory management 以编程方式查找我的应用程序内存足迹

Memory management 以编程方式查找我的应用程序内存足迹,memory-management,jvm,java-8,Memory Management,Jvm,Java 8,我试图用实用的方法测量我的应用程序内存足迹。 我使用java.lang.management类来计算这个 val heap = ManagementFactory.getMemoryMXBean.getHeapMemoryUsage val nonHeap = ManagementFactory.getMemoryMXBean.getNonHeapMemoryUsage val total = heap + nonHeap + (?) 我假设两者的总和将给出应用程序使用的内存总量,但事实并非如

我试图用实用的方法测量我的应用程序内存足迹。 我使用java.lang.management类来计算这个

val heap = ManagementFactory.getMemoryMXBean.getHeapMemoryUsage
val nonHeap = ManagementFactory.getMemoryMXBean.getNonHeapMemoryUsage
val total = heap + nonHeap + (?)
我假设两者的总和将给出应用程序使用的内存总量,但事实并非如此,实际大小更大,这是由top命令提供的


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

要找到由
top
提供的内存使用量,请检查进程的操作系统级统计信息。 在Linux上,您可以通过阅读
/proc/self/stat
/proc/self/status
来实现这一点。 更多关于

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

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

  • Java堆
  • 元空间(用于类元数据)
  • 代码缓存(JIT编译方法和所有生成代码的地方)
  • 直接副缓冲器
  • 内存映射文件,包括JVM映射的文件,如类路径上的所有JAR文件
  • 线程堆栈
  • JVM代码本身和Java运行时加载的所有动态库
  • 许多其他内部JVM结构

“实际尺寸更大”-您是如何找到“实际”尺寸的?请使用您发现实际尺寸更大的方式。@a实际尺寸是通过top命令获得的。我更新了我的问题。你使用了哪个值?因为其他进程不知道Java对象,所以它们不会告诉您使用的大小,而是提交的大小,甚至是最大大小。看,谢谢!jvm是否有办法获得比ManagementFactory报告的堆内存和非堆内存更多的信息?