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

Pan*_*kaj 911 java parameters jvm memory-management

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

hex*_*ide 1250

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

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

java -Xms256m -Xmx2048m
Run Code Online (Sandbox Code Playgroud)

内存标志也可以指定多种大小,例如千字节,兆字节等.

-Xmx1024k
-Xmx512m
-Xmx8g
Run Code Online (Sandbox Code Playgroud)

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

使用这些设置时,请记住这些设置是针对JVM的堆的,并且JVM可以/将使用的内存多于分配给堆的大小.来自Oracle的文档:

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

  • 对,那是正确的.当它试图超过它时,尽管*可能*收集垃圾以试图释放足够的内存.如果仍然没有足够的内存来满足请求并且堆已经达到最大大小,则会发生"OutOfMemoryError". (50认同)
  • 因此,当内存使用超过Xmx时,我们会得到jvm内存异常. (10认同)
  • 正如[java -Xmx 1G意味着1 GB还是2 ^ 30 B?](http://stackoverflow.com/questions/32855984/does-java-xmx-1g-mean-1-gb-or-230- b/32858015#32858015),通过`-Xms256m`表示你开始的内存量的明确方式是"256 MiB",而不是"256 MB",因为它是二进制幂而不是10的幂.请参阅https://en.wikipedia.org/wiki/Binary_prefix.另外,因为为一个额外的Survivor空间池留出了一些不可用的空间,所以根据`Runtime.getRuntime().maxMemory()`实际可用的内存量小于通过-Xmx指定的值. (4认同)
  • 当我使用ForkJoin框架时,我的计算机崩溃了,因为它占用了太多内存.是否有可能在OpenJDK上默认没有内存硬限制? (2认同)
  • 与堆大小相关的常见错误的有用指南:http://blog.paulgu.com/java/6-common-errors-in-setting-java-heap-size/ (2认同)
  • 此信息不再是最新的:“Xms 标志没有默认值,Xmx 通常具有 256 MB 的默认值”。这取决于Java是否认为机器是客户端还是服务器,对于服务器来说,Xmx最大可以是32GiB。看一下 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html 和 https://docs.oracle.com/javase/8/docs/technotes/指南/vm/gctuning/parallel.html#default_heap_size (2认同)

Rup*_*dav 287

运行该命令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
Run Code Online (Sandbox Code Playgroud)

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

我希望这将有助于您了解Xms,Xmx以及其他更重要的事情.:)


小智 16

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

在此输入图像描述

  • 这不能回答问题。问题在于它们的用途,而不是如何设置它们。 (6认同)

小智 12

问题的主要部分已在上文讨论过.只需添加部分默认值.

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

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

  • 对于其他JVM(除JRockit之外),请参阅此文章以确定JVM的默认Xmx/Xms值:http://stackoverflow.com/questions/4667483/how-is-the-default-java-heap-size-determined (7认同)

laz*_*ead 12

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

-Xmx最大堆大小

  • 您能否提供有关“由于用户不活动或 GC 迭代”的更多详细信息?那么初始堆大小和最小堆大小有什么区别呢? (3认同)
  • 堆大小共有三种:已使用的、已提交的和最大的。使用的堆大小可以小于 -Xms,但提交的堆大小(即通过 malloc() 从操作系统分配)始终至少为 -Xms。有些操作系统会很乐意使用 malloc() 获得比实际拥有的更多的内存,并希望并非所有应用程序都实际使用它们 malloc() 的所有内容,因此“提交”在某种程度上是一个相对术语。 (2认同)