以编程方式查找我的应用程序内存占用空间
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 结构。
我正在尝试实用地测量我的应用程序内存足迹。 我正在使用 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 结构。