我想限制JVM使用的最大内存。请注意,这不仅仅是堆内存,我想要限制该进程使用的总内存。
我想限制JVM使用的最大内存。请注意,这不仅仅是堆内存,我想要限制该进程使用的总内存。
使用参数-Xms<memory>
和-Xmx<memory>
。在数字后面加上M
或G
分别表示兆字节和千兆字节。 -Xms
表示堆内存的最小值,-Xmx
表示最大值。
你不应该担心堆栈泄漏内存(这种情况非常少见)。唯一可能导致堆栈失控的情况是无限递归(或非常深的递归)。
这只涉及堆。抱歉,起初我没有完全阅读你的问题。
你需要使用以下命令行参数运行JVM。
-Xmx<ammount of memory>
示例:
-Xmx1024m
这将允许JVM最大使用1GB的内存。
-XX:MaxDirectMemorySize
来控制它。虽然我没有进行过大量的分析来确保,但仍然有把握 ;) - alexandergunnarsonMaxDirectMemorySize
只影响 NIO 缓冲区。JVM 使用各种其他本机内存。 - Christopher Schultz如果您想限制jvm的内存(而不是堆大小) ulimit -v
为了更好地理解jvm和堆内存之间的区别,请参阅这篇优秀的文章 http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the-java-process.html
ulimit
是一个Linux命令吗?我快速进行了谷歌搜索,没有看到ulimit
与JVM之间的任何关系。 - Sam以上答案在某种程度上是正确的,你无法优雅地控制Java进程分配多少本地内存。它取决于你的应用程序正在做什么。
话虽如此,根据平台,您可能可以使用一些机制(例如ulimit)来限制Java或任何其他进程的大小。
但是,如果达到限制,不要指望它能够优雅地失败。与Java堆上的分配失败相比,本地内存分配故障更难以处理。 应用程序很有可能会崩溃,但是这取决于保持进程大小对系统的重要性,这可能仍然适合您。