【发布时间】:2013-11-20 18:31:42
【问题描述】:
有很多 JVM 参数会影响 JVM 的内存使用,例如 -Xms, -Xmx, -Xns, -XX:MaxPermSize...
- 他们是做什么的?
- 还有吗?
- 当我遇到什么错误(例如
OutOfMemoryError、StackOverflowError...)时,我必须增加哪一项?
我找不到适合他们的备忘单 - 让我们在这里创建一个。
【问题讨论】:
标签: java jvm jvm-arguments
有很多 JVM 参数会影响 JVM 的内存使用,例如 -Xms, -Xmx, -Xns, -XX:MaxPermSize...
OutOfMemoryError、StackOverflowError...)时,我必须增加哪一项?我找不到适合他们的备忘单 - 让我们在这里创建一个。
【问题讨论】:
标签: java jvm jvm-arguments
-Xms:此选项设置初始和最小 Java 堆大小。
-Xmx:
此选项设置最大 Java 堆大小。 Java 堆(“堆”)是内存的一部分,其中内存块被分配给对象并在垃圾回收期间被释放。
-XX:PermSize: -XX:MaxPermSize: 用于设置永久代的大小。永久空间是存储类、方法、内部化字符串和 VM 使用的类似对象的位置,并且永远不会被释放(因此得名)。
-Xss: 设置线程堆栈大小。线程堆栈是为每个 Java 线程分配的内存区域,供其内部使用。这是线程存储其本地执行状态的地方。
-Xns: 设置托儿所大小。 JRockit JVM 在使用分代垃圾收集模型时使用托儿所,即当动态垃圾收集器确定应该使用分代垃圾收集模型或静态分代并发垃圾收集器(-Xgc:gencon)已经选择。您还可以在运行动态垃圾收集器 (-XgcPrio) 时使用 -Xns 设置静态托儿所大小。
如果您获得的是 java.lang.OutOfMemoryError: Java heap space,请更改 -Xmx 和 -Xms 的值。
如果您获得 java.lang.OutOfMemoryError: PermGen space,请尝试增加 - XX:MaxPermSize 的值。
如果您获得 java.lang.StackOverflowError,请尝试增加 -Xss 的值。增加堆栈大小可能会有所帮助,但您也应该查看您的代码。
【讨论】:
有数百个可用的 JVM 选项。基本上它们分为三种类型:
几个标准选项列表:[要查看完整列表,请执行命令“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 选项的列表:[完整列表可用here]
-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 选项方面的知识,请参考this blog。该链接只是 8 部分中的第 1 部分。查找并阅读其他部分。
【讨论】:
-Xss:堆栈大小。
用于设置堆栈的大小。堆栈值只存在于创建它们的函数的范围内。一旦函数返回,它们就会被丢弃。
用完堆栈空间的最简单方法是递归太深。
-Xms, -Xmx:最小和最大堆大小。
用于设置堆的大小。堆是分配对象的地方。对象在被垃圾回收之前一直存在。
用完堆空间的最简单方法是分配大量的东西。
-XX:MaxPermSize:永久代。
永久代是特殊的,因为它保存了虚拟机所需的数据,用于描述在 Java 语言级别不具有等价性的对象。例如,描述类和方法的对象存储在永久代中。
如果您以某种方式泄漏对动态加载的类的引用,则通常会用完 permgen 空间。这尤其困扰着一些 Web 容器。
【讨论】:
阅读JVM options explained。以下是其中的摘录:
java.lang.OutOfMemoryError: Java heap space 错误,您应该增加-Xmx 的值。-XX:PermSize 和-XX:MaxPermSize 不需要调整,但如果您经常看到java.lang.OutOfMemoryError: PermGen space 事件,您可以增加这些值。-XX:MaxJavaStackTraceDepth - 这指定在抛出 StackOverflowError 之前,对于抛出的错误或异常的堆栈跟踪可以有多少条目。因此,如果您正在处理巨大的堆栈跟踪,您可以使用此选项在溢出之前增加允许的条目。【讨论】: