【问题标题】:Find my application memory foot print programmatically以编程方式查找我的应用程序内存占用空间
【发布时间】:2016-02-03 19:48:31
【问题描述】:

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

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

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

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

【问题讨论】:

  • '实际尺寸更大' - 你是如何找到“实际”尺寸的?
  • 使用你发现实际尺寸更大的方式。
  • @apangin 实际大小是通过 top 命令获取的。我更新了我的问题。
  • 您使用了哪个值?由于其他进程不知道 Java 对象,它们不会告诉您 used 大小,而是 committed 甚至 max 大小。见MemoryUsage

标签: memory-management jvm java-8


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢!有没有办法让 jvm 获得比 ManagementFactory 报告的堆和非堆内存更多的信息?
猜你喜欢
  • 2016-01-16
  • 2011-03-08
  • 2011-07-16
  • 2020-04-13
  • 2012-09-15
  • 1970-01-01
  • 2012-07-28
  • 2014-04-18
  • 2021-10-18
相关资源
最近更新 更多