如何设置JVM的最大内存使用量?

168

我想限制JVM使用的最大内存。请注意,这不仅仅是堆内存,我想要限制该进程使用的总内存。

5个回答

109

使用参数-Xms<memory>-Xmx<memory>。在数字后面加上MG分别表示兆字节和千兆字节。 -Xms表示堆内存的最小值,-Xmx表示最大值。


131
他在询问JVM内存。您所说的是堆大小。它们是不同的。 - vsingh
11
重申其他评论所提到的,Xms和Xmx只配置堆空间。虽然配置这些变量对非堆空间有间接影响,但提问者想要确定是否有一种方法来配置总内存使用量(堆空间+非堆空间)。 - murungu
7
嗯,我设置了“-Xmx524M”,但进程占用了1.2 GB的内存。 (?) - phil294
22
这不是正确的答案,-Xms和-Xmx选项仅调节jvm堆大小,而非总内存分配。 - Peter De Winter
1
我认为这个用于控制总内存,JVM8现在使用一个自由大小的“PermGen”来存储类和代码。 - ChRoNoN
显示剩余4条评论

46

你不应该担心堆栈泄漏内存(这种情况非常少见)。唯一可能导致堆栈失控的情况是无限递归(或非常深的递归)。

这只涉及堆。抱歉,起初我没有完全阅读你的问题。

你需要使用以下命令行参数运行JVM。

-Xmx<ammount of memory>

示例:

-Xmx1024m

这将允许JVM最大使用1GB的内存。


2
这并不是真的,根据这个帖子,你可以通过多种方式泄漏堆外存储。https://dev59.com/3knSa4cB1Zd3GeqPOoJx - erotsppa
你说得对,有很多与堆栈无关的内存问题的解决方法。然而,它们并不是很常见。 - jjnguy
11
你肯定无法控制非堆内存的大小,对吗? - matt b
相信你可以通过 -XX:MaxDirectMemorySize 来控制它。虽然我没有进行过大量的分析来确保,但仍然有把握 ;) - alexandergunnarson
2
@alexandergunnarson MaxDirectMemorySize 只影响 NIO 缓冲区。JVM 使用各种其他本机内存。 - Christopher Schultz
很好的观点@ChristopherSchultz。一年后回来看,我意识到这是事实。这很不幸但也是无法避免的。幸运的是,许多Java库(如Netty)仅将NIO缓冲区用于非堆内存(因此可以进行配置),而不是使用JNI等方式。 - alexandergunnarson

20

9
ulimit是一个Linux命令吗?我快速进行了谷歌搜索,没有看到ulimit与JVM之间的任何关系。 - Sam
是的,这是Linux命令。http://tldp.org/LDP/solrhe/Securing-Optimizing-Linux-RH-Edition-v1.3/x4733.html - vsingh
2
JVM 不太能很好地处理以这种方式设置的限制。 - Jimmy R.T.

12

以上答案在某种程度上是正确的,你无法优雅地控制Java进程分配多少本地内存。它取决于你的应用程序正在做什么。

话虽如此,根据平台,您可能可以使用一些机制(例如ulimit)来限制Java或任何其他进程的大小。

但是,如果达到限制,不要指望它能够优雅地失败。与Java堆上的分配失败相比,本地内存分配故障更难以处理。 应用程序很有可能会崩溃,但是这取决于保持进程大小对系统的重要性,这可能仍然适合您。


1
NativeHeap 可以通过 -XX:MaxDirectMemorySize=256M 来增加(默认为 128)。
我从未使用过它。也许你会发现它有用。

1
我怀疑 OP 想要的不是这个:当你从 Java 调用 C/C++ 代码时,会使用本地内存。 - om-nom-nom
12
如果你使用直接内存分配缓冲区,那么在进行 NIO 调用时也会使用本地内存。(...以及类加载器和线程信息...) - stu

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