如何在Windows上限制打包在jar中的Java应用程序的内存使用(-Xmx似乎不起作用)

如何在Windows上限制打包在jar中的Java应用程序的内存使用(-Xmx似乎不起作用),java,memory,jar,memory-management,Java,Memory,Jar,Memory Management,我想限制Java应用程序的最大堆大小,但它似乎不起作用。我正在通过Windows中的bat从jar包运行应用程序。Bat内容: @Echo off set CLASSPATH=. java -Xmx32m -classpath %CLASSPATH% -jar MyApplication.jar 这将限制32兆字节的最大堆大小。但是,当我使用应用程序执行消耗内存的操作时,Windows任务管理器显示内存消耗至少达到70 MB左右。。。我甚至试过使用-Xmx2m,但没有任何区别 所以,我不完全确

我想限制Java应用程序的最大堆大小,但它似乎不起作用。我正在通过Windows中的bat从jar包运行应用程序。Bat内容:

@Echo off
set CLASSPATH=.
java -Xmx32m -classpath %CLASSPATH% -jar MyApplication.jar
这将限制32兆字节的最大堆大小。但是,当我使用应用程序执行消耗内存的操作时,Windows任务管理器显示内存消耗至少达到70 MB左右。。。我甚至试过使用-Xmx2m,但没有任何区别

所以,我不完全确定问题出在哪里。当然,内存使用中包含堆栈等,但程序使用的内存应该主要是堆空间

Java版本似乎是1.6.0_14

对于那些对我所追求的感兴趣的人,我试图了解当我的应用程序耗尽堆空间时,它在某些函数中的行为

编辑:嗯。。我感到惊讶的是,当使用监视时,堆的使用量实际上被限制在32M。要用更多的内存

谢谢你的建议,
Touko

我不认为TaskManager专门显示堆内存。它包括程序当时使用的所有内存


为了分析堆内存,您可以使用探查器(比如您的工具包)并查看是否遵守堆限制-Xmx。这也将帮助您分析您感兴趣的程序部分。

嗯……它不完全是这样工作的。


虽然
-Xmx32m
与您在任务管理器中看到的内容之间存在关系,但这不是一对一的关系。请理解,任务管理器并没有报告堆大小,而是报告JVM消耗的所有内存,而您的代码只是其中的一个子集。

尝试设置-Xmx128,看看是否出现OutOfMemoryError。然后应该确认它至少已经被设置好了。

也许您实际上没有使用那么多内存,但是JVM是通过引入外部库之类的方式来实现的


要测试这一理论,您可以使用Runtime类查看总内存和已用内存。

您可以看到堆大小和永久生成的总和。可以使用-XX:MaxPermSize命令行参数调整perm大小。例如,这会将其设置为128m

java -Xmx32m -XX:MaxPermSize=128m ...

有不同的要点需要记住,这可以最大限度地减少程序的内存使用

下面是IBM提供的一个很好的列表。我有时觉得它很方便


是的,理论上我知道,我只是没想到会有这么大的差别。差别可能很大。我今天刚刚发布了一个问题……我的服务器JVM消耗的堆大小是最大堆大小的3倍!是的,我检查了控制台,堆限制确实得到了遵守,堆空间和其他内存使用之间的差异与我预期的不同。有了2000万,我成功地获得了.OutOfMemoryError:Java堆空间您忘了提到JVM消耗的内存。这不是小事。