启动JVM时,-Xms和-Xmx参数是什么?


1006

请说明JVM 中XmsXmx参数的使用。它们的默认值是多少?


2
使用时,-Xmx128m -Xms64m它可以主峰周围有275mRES MEM,但使用时-Xmx128m -Xms128m能达到顶峰周围550mRES MEM使用Java 8最好的办法是强调GC,看看会发生什么...
克里斯托夫•鲁西

Answers:


1358

该标志Xmx指定Java虚拟机(JVM)的最大内存分配池,而Xms指定初始内存分配池。

这意味着您的JVM将以Xms内存量启动,并且将能够使用最大Xmx数量的内存。例如,启动如下所示的JVM将以256 MB的内存启动它,并将允许该进程使用最多2048 MB的内存:

java -Xms256m -Xmx2048m

也可以以不同的大小指定内存标志,例如千字节,兆字节等。

-Xmx1024k
-Xmx512m
-Xmx8g

Xms标志没有默认值,Xmx通常默认值为256 MB。这些标志的常见用法是遇到时java.lang.OutOfMemoryError

使用这些设置时,请记住,这些设置用于JVM的,并且JVM可以/将使用的内存比分配给堆的大小更多。从Oracle文档中

请注意,JVM使用的内存不仅仅是堆。例如,Java方法,线程堆栈和本机句柄与堆以及JVM内部数据结构分开分配在内存中。


12
就像当内存使用量超过Xmx时,我们会导致jvm内存不足异常。
Pankaj 2013年

59
对,那是正确的。当它试图超过该值时,尽管它可能会收集垃圾以尝试释放足够的内存。如果仍然没有足够的内存来满足请求,并且堆已经达到最大大小,OutOfMemoryError则会发生。
戴维·康拉德

2
当我使用ForkJoin框架时,计算机崩溃,因为它占用了太多内存。默认情况下,在OpenJDK上是否可能没有硬限制?
Christophe De Troyer

6
java -Xmx 1G所指的是1 GB或2 ^ 30 B?,表示您通过via起始多少内存的明确方法-Xms256m是“ 256 MiB”,而不是“ 256 MB”,因为它采用二进制幂而不是10的幂。请参阅en.wikipedia.org/wiki/Binary_prefix。另外,由于为多余的Survivor空间预留了一些不可用的空间,因此实际可用的内存量Runtime.getRuntime().maxMemory()小于通过-Xmx
nealmcb

1
有关堆大小的常见错误的有用指南:blog.paulgu.com/java/6-common-errors-in-setting-java-heap-size
ctrlplusb

313

运行命令java -X,您将获得所有-X选项的列表:

C:\Users\Admin>java -X
-Xmixed           mixed mode execution (default)
-Xint             interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
                      set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
                      append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
                      prepend in front of bootstrap class path
-Xdiag            show additional diagnostic messages
-Xnoclassgc       disable class garbage collection
-Xincgc           enable incremental garbage collection
-Xloggc:<file>    log GC status to a file with time stamps
-Xbatch           disable background compilation
-Xms<size>        set initial Java heap size.........................
-Xmx<size>        set maximum Java heap size.........................
-Xss<size>        set java thread stack size
-Xprof            output cpu profiling data
-Xfuture          enable strictest checks, anticipating future default
-Xrs              reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni       perform additional checks for JNI functions
-Xshare:off       do not attempt to use shared class data
-Xshare:auto      use shared class data if possible (default)
-Xshare:on        require using shared class data, otherwise fail.
-XshowSettings    show all settings and continue
-XshowSettings:all         show all settings and continue
-XshowSettings:vm          show all vm related settings and continue
-XshowSettings:properties  show all property settings and continue
-XshowSettings:locale      show all locale related settings and continue

-X选项是非标准的,如有更改,恕不另行通知。

我希望这将有助于你理解XmsXmx以及许多其他的事情,才是最重要的。:)


1
今天学会了一条新命令,谢谢@RupeshYadav
jump_monkey '19

18

您可以在IDE中指定它。例如,对于Eclipse中的运行配置VM参数。您可以输入-Xmx800m -Xms500m

在此处输入图片说明


在OSX上的RubyMine中,它位于帮助菜单>编辑自定义VM选项中。
乔恩·施耐德

8
这不能回答问题。问题在于它们的用途,而不是如何设置它们。
上尉曼

@Hearen如何在intellij中分离?


3

-Xms用于启动的初始堆大小,但是,在工作过程中, 由于用户不活动或GC迭代,堆大小可能小于-Xms。这不是最小的必需堆大小。

-Xmx最大堆大小

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.