我有一个在Ubuntu OS上运行的java进程,根据jconsole,它显示堆内存为150 MB但对于同一进程"系统监视器"在ubuntu中显示约。 470 MB。此外,当我在类路径中检查jar的大小时,它大约200 MB。
我正在考虑类路径中存在的所有jar都将在JVM中加载到该特定进程。
任何人都可以帮助我理解吗? ......我错过了什么?
答案 0 :(得分:1)
Ubuntu系统管理器显示JRE(Java运行时环境)占用的完全内存。 JRE包含其他内存,例如堆栈内存(本机和Java堆栈),代码内存(存在java类和代码)以及堆内存。因此,JConsole的堆内存总是小于内存管理器显示的内存。此外,JRE独立于OS管理内存。因此,它可能已经从OS获得了更多的内存,但是目前你的程序需要更少的内存。所以,它是这样的,所以每当你的程序需要更多内存时,它就不必去操作系统请求更多的内存。因为从OS请求更多内存的系统调用是昂贵的。
来到你的JAR加载问题。存在于类路径中的所有jar可能不一定由您的JRE加载。它们将按需加载。因此,您的类路径中可能会出现100个Jars,但其中一个jar中只有2个类被加载。因此,这两个类将被加载到内存中。
为了执行更复杂的内存分析,我建议您使用附带几个插件的JVisualVM来分析程序中的内存。