Windows上的Java进程使用的内存比-xms参数指定的要少?

3

我使用"java -xms 1280m -xmx 1280m"命令启动我的服务器。 在Linux机器上,这很好用,并且我看到进程使用的内存量几乎相同。 然而,在Windows机器上,我看到Java进程使用的远远少于1280m-大约500-600m。 如果有关系的话,我从Windows任务管理器收集了这些数据。 我检查过的两台Windows机器都是Windows 2003服务器,分别具有2GB和3GB的RAM。

我一直认为使用-xms指定初始堆大小将强制Java使用至少该数量的内存。 我错了吗? 或者,这是Windows上Java的一个特殊情况?


我现在无法检查,所以我不会发布答案。但是在Windows上,参数的大小写是否有关系?我认为x需要大写,但不确定。由于我在手机上,拼写可能有误,请见谅。 - Kevin D
4个回答

2

仔细看一下。任务管理器通常会误导人 - 默认情况下,它不会显示进程已分配多少内存。相反,“使用的内存”显示的是为该进程交换的物理内存量。 在“查看”菜单中,选择“选择列”,然后添加“虚拟内存大小”。这就是你的内存。你的应用程序显然从未真正使用超过500-600m的内存,因此它从未被交换。


0

终于回到电脑前,进行了几个快速测试。

在我的Windows XP机器上运行java -xms会输出无法识别的选项

当我运行java -Xms时,我得到一个无效的初始堆大小,这是正确的,因为我没有给出任何值,但它接受并识别该选项。

所以看来我的评论是正确的,你需要在命令中解决大小写问题。


谢谢您的评论。我的错。我正在使用大写选项-Xms。所以,这不是大小写的问题。 - John Smith
实际上,我注意到你的问题中提到了“启动我的服务器”。你使用哪个服务器,以及你如何设置Xms等参数?我问这个问题是因为如果你正在使用某个“run.bat”文件,它可能会忽略/覆盖/未获取你的选项。 - Kevin D
我正在使用JBoss,但我们使用自定义脚本启动它(别问为什么!)。 -Xms在脚本中作为“java”命令的参数进行设置。 - John Smith
我已经没有太多的想法了。我最后的建议是使用Sysinternals Process Explorer来检查为jboss服务器启动的java.exe,这将显示它实际接收到的参数。如果Java进程确实获得了您的选项...那么我就束手无策了。 - Kevin D

0
除了Kevin D提到的大写外,还要注意32位Windows系统通常对最大堆大小有上限。这个上限往往会因许多因素而异,但我经常看到它在你尝试的1280m左右。我怀疑这不是问题所在,但它可能是相关问题。

0
Windows任务管理器是为终端用户设计的,而不是为程序员设计的。后者通常更喜欢Sysinternals套件中的进程资源管理器(procexp.exe)。结合使用vmmap.exe,可以准确地显示正在发生的情况。

没听说过vmmap...看起来非常方便,我需要把它加入我的工具箱。谢谢。 - Kevin D
我会尝试使用Process Explorer和VMMap.exe。谢谢! - John Smith

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