JVM参数
标签(空格分隔): JVM
重要参数
-Xms and -Xmx (or:-XX:InitialHeapSize and -XX:MaxHeapSize)
-Xms
的作用是 定义堆的初始化大小,默认值是 物理内存的1/64(<1GB),默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%,JVM就会增大堆直到-Xmx
的最大限制。
-Xmx
的作用是 定义最大堆的大小,默认为物理内存的1/4(< 1GB),默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到-Xms
的大小。
一般来说,这两个参数的数值单位是Byte,但同时它们也支持使用其他单位(k,m,g)。举个例子,下面的命令启动了一个初始化堆内存为128M,最大堆内存为2G,名为“MyAPP”的Java应用程序。
java -Xms128m -Xmx2g MyApp
在实际使用过程中,初始化堆内存的大小通常被视为堆内存大小的下界。然后JVM可以在运行时动态的调整堆内存的大小,所以理论上来说我们有可能会看到堆内存的大小小于初始化堆内存的大小。但是即使在非常低的堆内存使用下,我也从来没有遇到过这种情况。这种行为将会方便开发者和系统管理员,因为我们可以通过将-Xms
和-Xmx
设置为相同大小来获得一个固定大小的堆内存。 -Xms
和-Xmx
实际上是-XX:InitialHeapSize
和-XX:MaxHeapSize
的缩写。我们也可以直接使用这两个参数,它们所起得效果是一样的:
java -XX:InitialHeapSize=128m -XX:MaxHeapSize=2g MyApp
需要注意的是,所有JVM关于初始或最大堆内存大小的输出都是使用它们的完整名称:InitialHeapSize
和InitialHeapSize
。所以当你查询一个正在运行的JVM的堆内存大小时,如使用-XX:+PrintCommandLineFlags
参数或者通过JMX查询,你应该寻找InitialHeapSize
和InitialHeapSize
标志而不是Xms
和Xmx
。
在实际使用中,我们常常将 -Xms
和-Xmx
的大小设置一致,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn
-Xmn
的作用主要是定义 年轻代的大小。整个JVM内存的大小 = 年轻代大小 + 老年代大小 + 持久代大小。通常情况下,持久代一般固定大小为64m,所以增大年轻代后,将会减少老年代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
java -Xms128m -Xmx2g -Xmn1g MyApp
上面的命令就是以年轻代2g的大小启动 MyApp进程。
-Xss
-Xss
的主要作用是 设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K,可根据具体应用线程所需内存大小进行 调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右一般小的应用,如果栈不是很深,应该是128k够用的,稍大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。
-XX:PermSize & -XX:MaxPermSize
-XX:PermSize
的作用是 设置持久代的初始化大小值。默认是物理内存的1/64。
-XX:MaxPermSize
的作用是 设置持久代的最大值,默认是物理内存的1/4。
永久代是JDK1.8以下版本对 方法区的具体实现。主要存放了一些元数据,例如Class、Method的元信息。为了成功运行应用程序,JVM会加载很多类(因为它们依赖于大量的第三方库,而这又依赖于更多的库并且需要加载这些类)这就需要增大永久代的大小。我们可以使用-XX:PermSize
和-XX:MaxPermSize
来达到这个目的。下面是一个简单的例子:
java -XX:PermSize=64m -XX:MaxPermSize=256m MyApp
请注意,这里设置的永久代大小并不会被包括在参数XX:MaxHeapSize
设置的堆内存大小中。我的理解是:MaxHeapSize是
设置的堆(Heap)的大小,MaxPermSize
设置的是永久代(方法区具体实现)的区域大小,也就是说两个参数设置的都不是一个区域。
其他参数
参数 | 含义 | 默认值 | 说明 |
---|---|---|---|
-XX:NewRatio | 年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代) | -XX:NewRatio=4表示年轻代与年老代所占比值为1:4 年轻代占整个堆栈的1/5Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。 |
|
-XX:SurvivorRatio | 设置Eden区与Survivor区的大小比值 |