Memory management 以编程方式查找我的应用程序内存足迹
我试图用实用的方法测量我的应用程序内存足迹。 我使用java.lang.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 + (?) 我假设两者的总和将给出应用程序使用的内存总量,但事实并非如
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结构