启动JVM时-Xms和-Xmx参数是啥?

Posted

技术标签:

【中文标题】启动JVM时-Xms和-Xmx参数是啥?【英文标题】:What are the -Xms and -Xmx parameters when starting JVM?启动JVM时-Xms和-Xmx参数是什么? 【发布时间】:2013-01-23 15:48:31 【问题描述】:

请解释XmsXmx 参数在JVM 中的使用。它们的默认值是什么?

【问题讨论】:

当使用-Xmx128m -Xms64m 时,它可以在275m RES 内存附近达到峰值,但是当使用-Xmx128m -Xms128m 时,它可以在550m RES 内存附近达到峰值使用Java 8 最好的办法是强调GC 并查看在发生什么... 只是好奇,275m 和 550m - 它们是如何计算的? 【参考方案1】:

标志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's documentation:

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

【讨论】:

当内存使用量超过 Xmx 时,我们得到 jvm 内存不足异常。 是的,没错。当它试图超过该值时,尽管它可能收集垃圾以尝试释放足够的内存。如果仍然没有足够的内存来满足请求并且堆已经达到最大大小,则会出现OutOfMemoryError 当我使用 ForkJoin 框架时,我的计算机崩溃了,因为它占用了太多内存。有没有可能在 OpenJDK 上默认没有对内存的硬限制? 正如Does java -Xmx 1G mean 1 GB or 2^30 B? 所阐明的那样,通过-Xms256m 表示您开始使用多少内存的明确方式是“256 MiB”,而不是“256 MB”,因为它是通过二进制幂而不是十次方。见en.wikipedia.org/wiki/Binary_prefix。另外,由于为额外的Survivor空间池预留了一些不可用的空间,所以根据Runtime.getRuntime().maxMemory()实际可用的内存量小于通过-Xmx指定的值 与堆大小相关的常见错误的有用指南:blog.paulgu.com/java/6-common-errors-in-setting-java-heap-size【参考方案2】:

运行命令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 以及许多其他最重要的事情。 :)

【讨论】:

【参考方案3】:

您可以在 IDE 中指定它。例如,对于 Run ConfigurationsVM arguments 中的 Eclipse。可以输入-Xmx800m -Xms500m

【讨论】:

在 OSX 上的 RubyMine 中,它位于帮助菜单 > 编辑自定义 VM 选项中。 这不能回答问题。问题在于它们的用途,而不是如何设置它们。 @Hearen 如何在 intellij 中设置??【参考方案4】:

上面已经解决了问题本身。 只需添加部分默认值即可。

根据http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

Xmx 的默认值取决于平台和系统中可用的内存量。

【讨论】:

对于其他 JVM(除了 JRockit),请参阅这篇文章以确定您的 JVM 的默认 Xmx/Xms 值:***.com/questions/4667483/…【参考方案5】:

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

-Xmx 最大堆大小

【讨论】:

您能否提供更多关于“由于用户不活动或 GC 迭代”的详细信息?那么初始堆大小和最小堆大小有什么区别?

以上是关于启动JVM时-Xms和-Xmx参数是啥?的主要内容,如果未能解决你的问题,请参考以下文章

JVM启动参数

jvm学习 - 虚拟机启动常用参数

启动JAVA程序时,参数-Xms及Xmx有啥用

无法通过 .bat 文件设置 jvm 参数/参数(Xmx 和 Xms)

jvm参数

JVM之对分配参数详解