Windows 任务管理器中 javaw.exe 的内存与 Java Mission Control 的比较

4
我正在使用安装有Java 8 Update 45 的Windows 7机器来开发一个Java应用程序。我注意到Windows任务管理器通过javaw.exe映像显示的应用程序使用的内存量与Eclipse Memory Analyzer /Java Mission Control报告的数量相差很大。
例如,Java Mission Control报告使用150 MB的Java堆内存,而Windows表示javaw.exe的工作集使用303 MB。我理解JVM本身、GC等可能会有一些开销。
但是我也看到它执行垃圾回收。经过一番点击以使内存增长后,JMC显示已执行GC并且堆使用了200 MB。Windows报告使用了619 MB(它从未下降)。Windows是否没有正确显示Java的内存使用情况?或者是应用程序导致这种情况发生的?
1个回答

4
当JVM启动时,它为堆分配了一段连续的内存区域。该内存可以懒惰地转换为实际内存,但几乎从不返还给操作系统。
堆只是JVM使用的一片内存区域,对于你来说可能是最重要的,但当你的堆非常小的时候,它可能比JVM使用的其他区域小。这包括:
- 本机内存(例如直接ByteBuffer) - GUI本机组件 - 共享库 - jar文件 - Metaspace(或perm gen) - 线程栈内存
“Windows没有正确显示Java使用的内存吗?”
Windows显示的是所有内存使用情况,而不仅仅是堆所用的部分。
“应用程序导致了这种情况吗?”
Windows不知道你正在使用多少最大堆大小。

如何防止应用程序占据所有Windows内存?是否有一种方法将其传递回操作系统? - user1795832
@user1795832 你需要给应用程序分配所需的内存,并让它自己管理内存。设置最大堆大小并不是设置最大内存,但通常情况下,JVM执行其他任务时使用几百MB的内存不是问题(除非你使用的是小型设备)。 - Peter Lawrey
你所说的给应用程序分配我想要它使用的内存是什么意思?只是通过Xmx指定可以使用的堆内存大小,然后让它自己运行吗? - user1795832
我已经尝试了所有这些,但Windows进程显示它在jconsole表示JVM有足够的可用堆内存时仍然占用更多的内存。我将最大值设置为512 MB,一旦达到约450左右,就会进行垃圾回收,堆会按预期降下来。但是Windows Java进程不会降下来。每当我点击应用程序以使用堆内存时,它会使用堆,但Windows进程仍然会增加。 - user1795832
@user1795832,你是在说它会无限制地增长,还是当堆大小达到500MB时会有一个类似800MB的限制呢? - Peter Lawrey
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接