2016-11-10 74 views
1

我有一个在Ubuntu操作系统上运行的java进程,根据jconsole显示堆内存为150 MB,但对于相同的进程在Ubuntu系统监视器显示约。 470 MB。另外,当我检查classpath中的jar大小时,大约有200 MB。在Java中,堆内存vs系统内存

我在考虑所有存在于类路径中的jar将被加载到特定进程的JVM中。

请问任何人都可以帮我理解吗? ...我错过了什么?

+0

它比这复杂得多。 –

+0

JAR未加载到堆中。 –

+0

上述问题的任何更新 – Rajas

回答

1

Ubuntu系统管理器显示完全由JRE(Java运行时环境)占用的内存。 JRE包含其他内存,如堆栈内存(本机& Java堆栈),代码内存(其中存在Java类和代码)以及堆内存。因此,JConsole的堆内存总是比内存管理器显示的少。此外,JRE独立于OS管理内存。因此,它可能已经从操作系统获得了更多的内存,但是目前你的程序需要更少的内存。所以,它保持在每当你的程序需要更多内存时,它不必去OS请求更多的内存。因为从OS请求更多内存的系统调用很昂贵。

来到您的JAR加载问题。所有存在于你的classpath中的jar可能不一定会被你的JRE加载。他们将在需求基础上加载。因此,可能会发生在你的类路径中有100个罐子,但是其中一个罐子中只有2个类别被加载。因此,这两个类将被加载到内存中。

为了执行更复杂的内存分析,我建议您使用JVisualVM(附带几个插件)来分析程序中的内存。

+0

(该过程是事件触发)除此之外,当我的进程空闲(即没有任何事件)时,“系统监视器”中的系统内存继续越来越多。无法理解为什么? – Rajas