我一直在分析我的java应用程序,并且对我报告的应用程序的内存使用情况感到困惑(通过eclipse运行)。它总是与分析器报告的内存使用量大不相同,并且实际上甚至不匹配。
应用程序的JVM标志是:
-Xmx1G
-Xms1G
-XX:MaxMetaspaceSize=256M
-XX:CompressedClassSpaceSize=256M
此图显示进程“java”的报告内存为1.67GB。当我双击该过程时,细分显示1.15GB的“实际内存大小”和各种其他内存指标。
飞行记录器显示应用程序坚持其1GB堆大小。我进行了测试,表明它也符合其元空间限制。
我的问题有两个: 1)任何想法为什么报告的内存使用在过程(由Mac OS X报告)和分析器之间是如此不同? 2)任何想法为什么活动监视器中显示的内存与进程内存的细分之间存在差异?
答案 0 :(得分:4)
1)真实内存就是一切:堆+堆栈+ MetaSpace(以前的PermGen)+ CompressedClassSpaceSize +等。您将堆限制为1GiB,如Flight Recorder所示。操作系统将所有内容显示在一起,而不仅仅是堆,这是这种差异的起源。它不是特定于OS / JVM的(即,在* nix,Windows上尝试它,你会看到相同的。)
2)这是特定于操作系统的。对于Mac OS,请参阅this very detailed answer