JVM参数
java
特别说明:jvm
-Xms,堆的初始化大小,在JVM启动的时候,分配给堆的内存空间大小,java程序在运行的时候,jvm会尽量地将堆大小维持在初始化大小空间内,若是-Xms没法知足程序所须要的内存空间,则jvm会向操做系统申请更大的内存,直到内存超过了-Xmx,则会报OutOfMemoryError异常。若是-Xms设置的过小,会致使频繁的minor gc和 full gc,经过gc来释放无效的堆空间,可是过于频繁的gc会引发系统的性能问题。
ide
-Xmn用于设置新生代的大小,设置一个较大的新生代大小,就会减小老年代大小,这个参数对系统性能和GC行为有很大影响,新生代大小通常设置为堆大小的1/4 --1/3. -Xmn的效果等效于同时设置相同大小的-XX:NewSize和-XX:MaxNewSize,设置不一样的-XX:NewSize和-XX:MaxNewSize,可能会致使内存震荡。函数
-XX:PermSize是持久代的初始大小,-XX:MaxPermSize是持久代的最大值。持久代大小直接决定了系统支持多少个类定义和常量。性能
系统所支持的最大类数量,与MaxPermSize成正比,通常来讲,MaxPermSize设置为64M能够知足绝大多数应用程序,若是永久区依然溢出,再设置为128M,这两个值是经常使用的永久区取值,若是还溢出的话,那就考虑系统优化设计了,减小动态类的产生或者利用GC回收部分驻扎在永久区的无用类信息。优化
-Xss线程栈,是线程的私有空间,在局部变量分配和函数调用的时候,都须要在栈中开辟空间,若是开辟的栈过小,那么在线程运行的时候,可能没有足够的空间分配局部变量或者达不到足够的函数调用深度。若是开辟的栈太大,那么开设线程的内存成本就会增大,致使系统所能支持的线程数量就会减少。spa
因为java堆也是向操做系统申请内存空间的,若是java堆空间过大的话,则致使操做系统用于线程栈的空间减小,从而间接地致使系统所能支持的线程数量就会减少。操作系统
下面的例子是经过改变线程栈大小和改变堆大小,对线程数的影响。
线程
package com.wangbiao.performance.stack; /** * * @Title: TestThreadStack.java * @Package com.wangbiao.performance.stack * @Description: TODO * @author wangbiao * @date 2014-10-15 下午2:14:36 * @version V1.0 */ public class TestThreadStack { public static void main(String[] args) { int i = 0; try { for (i = 0; i < 10000; i++) { new Thread(new Runnable() { @Override public void run() { try { System.out.println(Thread.currentThread().getName()); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } } catch (OutOfMemoryError e) { System.err.println("Current Thread num is "+i); } // -Xmx100m -Xms100m -Xss50m Current Thread num is 25 // -Xmx100m -Xms100m -Xss60m Current Thread num is 19 // -Xmx100m -Xms100m -Xss70m Current Thread num is 15 // -Xmx100m -Xms100m -Xss50m Current Thread num is 25 // -Xmx300m -Xms300m -Xss50m Current Thread num is 21 // -Xmx500m -Xms500m -Xss50m Current Thread num is 17 } }
-XX:SurvivorRatio新生代中eden和s0或者eden和s1的比例,s0和s1的大小同样。设计
-XX:+PrintGCDetails -Xmn100m -XX:SurvivorRatio=8,
运行结果以下:eden space和from space或者to space的比例是8倍的关系
Heap def new generation total 92160K, used 8332K [0x24230000, 0x2a630000, 0x2a630000) eden space 81920K, 9% used [0x24230000, 0x249f6220, 0x29230000) from space 10240K, 3% used [0x29230000, 0x2928d090, 0x29c30000) to space 10240K, 0% used [0x29c30000, 0x29c30000, 0x2a630000)
-XX:NewRatio是老年代和新生代的比例
-XX:+PrintGCDetails -Xmx20m -Xms20m -XX:NewRatio=2
运行结果以下:tenured generation和new generation的比例是2倍的关系
Heap def new generation total 6144K, used 5227K [0x32e30000, 0x334d0000, 0x334d0000) eden space 5504K, 88% used [0x32e30000, 0x332ef588, 0x33390000) from space 640K, 57% used [0x33390000, 0x333eb880, 0x33430000) to space 640K, 0% used [0x33430000, 0x33430000, 0x334d0000) tenured generation total 13696K, used 0K [0x334d0000, 0x34230000, 0x34230000) the space 13696K, 0% used [0x334d0000, 0x334d0000, 0x334d0200, 0x34230000) compacting perm gen total 12288K, used 376K [0x34230000, 0x34e30000, 0x38230000) the space 12288K, 3% used [0x34230000, 0x3428e130, 0x3428e200, 0x34e30000) ro space 10240K, 54% used [0x38230000, 0x387adaf0, 0x387adc00, 0x38c30000) rw space 12288K, 55% used [0x38c30000, 0x392d1ce8, 0x392d1e00, 0x39830000)