有很多 JVM 参数会影响 JVM 的内存使用,例如-Xms, -Xmx, -Xns, -XX:MaxPermSize...
- 他们在做什么?
- 还有吗?
OutOfMemoryError
当我得到什么错误(例如,StackOverflowError
...)时,我必须增加哪一个?
我找不到适合他们的备忘单——让我们在这里创建一个。
有很多 JVM 参数会影响 JVM 的内存使用,例如-Xms, -Xmx, -Xns, -XX:MaxPermSize...
OutOfMemoryError
当我得到什么错误(例如,StackOverflowError
...)时,我必须增加哪一个?我找不到适合他们的备忘单——让我们在这里创建一个。
-Xms:
此选项设置初始和最小 Java 堆大小。
-Xmx:
此选项设置最大 Java 堆大小。Java 堆(“堆”)是内存的一部分,其中内存块被分配给对象并在垃圾回收期间被释放。
-XX:PermSize:
-XX:MaxPermSize:
用于设置永久代的大小。永久空间是存储类、方法、内部化字符串和虚拟机使用的类似对象的地方,并且从未被释放(因此得名)。
-Xss:
设置线程堆栈大小。线程堆栈是为每个 Java 线程分配的内存区域,供其内部使用。这是线程存储其本地执行状态的地方。
-Xns:
设置托儿所大小。JRockit JVM 在使用分代垃圾收集模型时使用托儿所,即当动态垃圾收集器确定应该使用分代垃圾收集模型或静态分代并发垃圾收集器(-Xgc:gencon)已经选择。您还可以在运行动态垃圾收集器 (-XgcPrio) 时使用 -Xns 设置静态托儿所大小。
如果你得到java.lang.OutOfMemoryError: Java heap space
比改变-Xmx
and的值-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 选项的列表:[此处提供完整列表]
-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 容器。
阅读JVM 选项解释。以下是其中的摘录:
java.lang.OutOfMemoryError: Java heap space
错误,你应该增加-Xmx
价值。-XX:PermSize
事件,您可以增加这些值。-XX:MaxPermSize
java.lang.OutOfMemoryError: PermGen space
-XX:MaxJavaStackTraceDepth
- 这指定在抛出错误或异常之前,堆栈跟踪可以有多少条目StackOverflowError
。因此,如果您正在处理巨大的堆栈跟踪,您可以使用此选项在溢出之前增加允许的条目。