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


Answers:


94

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


1
您可能还需要看看MaxPermSize。
urmalp

89
他在问JVM内存。您所说的是堆大小。他们俩都不一样
vsingh 2013年

8
要再次重申其他评论中提到的内容,Xms和Xmx仅配置堆。尽管配置这些变量对非堆空间有间接影响,但询问该问题的人正在尝试确定是否可以配置总内存使用量(堆+非堆)
murungu 2014年

2
hu。因此我进行了设置-Xmx524M,该过程占用了1.2 GB的RAM。(?)
phil294

7
这不是正确的答案,-Xms和-Xmx选项仅调节jvm堆大小,而不调节总内存分配。
彼得·德

31

您不必担心堆栈泄漏的内存(这种情况很少见)。唯一使堆栈失控的时间是无限(或非常深)的递归。

这只是堆。抱歉,起初没有完全阅读您的问题。

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

-Xmx<ammount of memory>

例:

-Xmx1024m

这将为JVM最多提供1GB的内存。


1
这是不正确的,根据这个线索,有多种方法可以泄漏堆之外stackoverflow.com/questions/1475290/...
erotsppa

没错,有很多方法可以解决与堆栈无关的内存问题。但是,它们不是很常见。
jjnguy

9
可以肯定,您不能控制非堆内存的大小,可以吗?
马特b

十分确定您可以通过进行控制-XX:MaxDirectMemorySize。并不是说我已经进行了大量分析以确保但仍然;)
alexandergunnarson

2
@alexandergunnarson MaxDirectMemorySize唯一影响NIO缓冲区。JVM使用所有其他各种本机内存。
Christopher Schultz '18


11

上面的答案是正确的,您不能优雅地控制Java进程分配多少本机内存。这取决于您的应用程序在做什么。

就是说,根据平台的不同,您也许可以使用某种机制(例如ulimit)来限制Java或任何其他进程的大小。

只是不要指望它达到该极限就会正常失败。本机内存分配失败比Java堆上的分配失败要难得多。应用程序很可能会崩溃,但是取决于减小系统大小对系统的重要性,这可能仍然适合您。


1

可以通过-XX:MaxDirectMemorySize = 256M来增加NativeHeap(默认值为128)

我没用过 也许您会发现它很有用。


1
我怀疑op是否希望这样做:当您从Java调用C / C ++代码时会使用本机内存。
om-nom-nom,

6
如果您为缓冲区分配直接内存,则在进行nio调用时也会使用本机内存。(...和类加载器以及线程信息。...)
stu 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.