【问题标题】: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 - 它们是如何计算的?

标签: java memory-management parameters jvm


【解决方案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 的默认值取决于平台和系统中可用的内存量。

    【讨论】:

    【解决方案5】:

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

    -Xmx 最大堆大小

    【讨论】:

    • 您能否提供更多关于“由于用户不活动或 GC 迭代”的详细信息?那么初始堆大小和最小堆大小有什么区别?
    猜你喜欢
    • 2012-08-01
    • 2013-01-16
    • 1970-01-01
    • 2011-09-03
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多