ChatGPT解决这个技术问题 Extra ChatGPT

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

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

使用 -Xmx128m -Xms64m 时,它可以在 275m RES 内存附近达到峰值,但是当使用 -Xmx128m -Xms128m 时,它可以在 550m RES 内存附近达到峰值 使用 Java 8 最好的办法是给 GC 施加压力,看看会发生什么......
只是好奇,275m 和 550m - 它们是如何计算的?

D
Dónal Boyle

标志 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 的 heap 的,并且 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
H
Hearen

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


R
Robert MacLean

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

-Xmx 是最大堆大小


您能否提供有关“由于用户不活动或 GC 迭代”的更多详细信息?那么初始堆大小和最小堆大小有什么区别呢?
我今天才意识到 -Xms 并不表示所需的最小堆内存大小。我们正在运行一个 -Xms 设置为 200 GB 的 java 进程,该进程在具有 256 GB RAM 的机器上运行。到目前为止,这个过程只消耗了 10 GB,这是因为到目前为止这个过程没有做太多的活动。所以,这个答案确实证实了这一点,但我希望看到有关此的文档/资源。太感谢了!
共有三种堆大小:已使用、已提交和最大。使用的堆大小可以小于 -Xms,但提交的堆大小(即通过 malloc() 从操作系统分配)始终至少为 -Xms。一些操作系统很乐意 malloc() 比拥有的内存更多,并希望并非所有应用程序都实际使用它们 malloc() ed 的所有内容,因此“提交”是一个相对的术语。
H
Hearen

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

https://i.stack.imgur.com/lJHpH.png


在 OSX 上的 RubyMine 中,它位于帮助菜单 > 编辑自定义 VM 选项中。
这不能回答问题。问题是关于它们的用途,而不是如何设置它们。
H
Hearen

这个问题本身已经在上面讨论过了。只需添加部分默认值。

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

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


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