JVM内存选项中的哪些参数代表什么?

26

有许多JVM参数会影响JVM的内存使用,例如-Xms、-Xmx、-Xns、-XX:MaxPermSize...

  • 它们是干什么用的?
  • 还有其他的参数吗?
  • 当我遇到什么错误时(例如OutOfMemoryErrorStackOverflowError等),我应该增加哪个参数?

我找不到一个好的速查表- 让我们在这里创建一个。


7
你可以开始查看http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html和http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html。然后,进行一些研究,以获得类似于http://www.avricot.com/blog/?post/2010/05/03/Get-started-with-java-JVM-memory-(heap%2C-stack%2C-xss-xms-xmx-xmn...)的结果。 - Luiggi Mendoza
更多有用的链接请访问https://dev59.com/KWkv5IYBdhLWcg3wlR71。 - Sachin Bhansali
4个回答

53

-Xms: 这个选项设置 Java 堆的初始大小和最小大小。

-Xmx: 这个选项设置 Java 堆的最大大小。Java 堆(“堆”)是内存的一部分,用于为对象分配内存块,并在垃圾回收期间释放。

-XX:PermSize:-XX:MaxPermSize: 用于设置永久代的大小。永久空间是 VM 使用的存储类、方法、内部化字符串和类似对象的地方,这些对象永远不会被释放(因此得名)。

-Xss: 设置线程堆栈大小。线程堆栈是为每个 Java 线程分配的内存区域,用于其内部使用。这是线程存储其局部执行状态的位置。

-Xns: 设置 nursery 大小。JRockit JVM 在使用分代垃圾回收模型时使用 nursery,也就是当动态垃圾回收器确定应该使用分代垃圾回收模型或选择了静态分代并发垃圾回收器(-Xgc:gencon)时。您还可以使用 -Xns 在运行动态垃圾回收器(-XgcPrio)时设置静态 nursery 大小。

  • 如果出现 java.lang.OutOfMemoryError: Java heap space 的错误,则请更改 -Xmx-Xms 的值。

  • 如果出现 java.lang.OutOfMemoryError: PermGen space 的错误,则尝试增加 -XX:MaxPermSize 的值。

  • 如果出现 java.lang.StackOverflowError 的错误,则尝试增加 -Xss 的值。增加堆栈大小可能有所帮助,但您也应该查看代码。


如果您不再引用先前加载的类,则可以释放Permgen空间。启用PermgenSweep是VM选项。澄清一下,幼儿园用于短期对象存储。 - Markus Koivisto

12

有数百个JVM选项可用,基本上它们分为三类:

  1. 标准选项。
  2. 非标准X选项。
  3. 非标准XX选项。

一些标准选项列表:[要查看完整列表,请执行不带任何选项的“java”命令]

 -client       to select the "client" VM
 -server       to select the "server" VM
 -cp <class search path of directories and zip/jar files>
 -classpath <class search path of directories and zip/jar files>
               A ; separated list of directories, JAR archives,
               and ZIP archives to search for class files.
 -D<name>=<value>
               set a system property
 -version      print product version and exit
 -showversion  print product version and continue
 -X            print help on non-standard options`

少数非标准 X 选项列表:[要查看完整列表,请执行命令 "java -X"]

-Xincgc           enable incremental garbage collection
-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
-Xmixed           mixed mode execution (default)
-Xint             interpreted mode execution only

一些非标准的XX选项列表:[完整列表可在这里查看]

-XX:InitialHeapSize=<size>        set initial Java heap size. Same as -Xms<size>.
-XX:MaxHeapSize=<size>            set maximum Java heap size. Same as -Xmx<size>.
-XX:+PrintFlagsFinal              prints all JVM options passed.
-XX:+UnlockDiagnosticVMOptions    opens up lot more VM options.

如想加强对JVM选项的了解,请参考这篇博客,该链接只是8个部分中的第一部分。请查找并阅读其他部分。


1
-Xss:堆栈大小。
用于设置堆栈的大小。堆栈值仅在创建它们的函数范围内存在。一旦函数返回,它们就会被丢弃。
最容易耗尽堆栈空间的方法是递归太深。
-Xms,-Xmx:最小和最大堆大小。
用于设置堆的大小。堆是您分配对象的地方。对象持久存在,直到进行垃圾收集。
最容易耗尽堆空间的方法是分配超大的东西。
-XX:MaxPermSize:永久代。
永久代很特殊,因为它保存了虚拟机所需的数据,用于描述在Java语言级别上没有等效性的对象。例如,描述类和方法的对象存储在永久代中。
如果您以某种方式泄漏了动态加载的类的引用,则通常会耗尽permgen空间。这尤其影响一些Web容器。

2
Xms 是用于最小堆大小而非栈大小。 - Trying

1

阅读解释JVM选项。以下是其中的摘录:

  • 如果您经常收到java.lang.OutOfMemoryError: Java heap space错误,则应增加-Xmx值。
  • 通常情况下,不需要调整-XX:PermSize-XX:MaxPermSize,但如果经常看到java.lang.OutOfMemoryError: PermGen space事件,则可以增加这些值。
  • -XX:MaxJavaStackTraceDepth - 这指定了在抛出错误或异常时堆栈跟踪可以具有多少条目,然后会抛出StackOverflowError。因此,如果您正在处理巨大的堆栈跟踪,则可以使用此选项在溢出之前增加允许的条目数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接