启动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 【问题描述】:请解释Xms
和Xmx
参数在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 选项是非标准的,如有更改,恕不另行通知。
我希望这将帮助您了解Xms
、Xmx
以及许多其他最重要的事情。 :)
【讨论】:
【参考方案3】:您可以在 IDE 中指定它。例如,对于 Run Configurations → VM 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参数是啥?的主要内容,如果未能解决你的问题,请参考以下文章