GC http://blog.csdn.net/ithomer/article/details/6252552
jvm堆内存申请过程
子主题
1.JVM 会试图为相关Java对象在Eden中初始化一块内存区域
子主题
2.当Eden空间足够时,内存申请结束;否则到下一步
新生代较小
3.JVM 试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收),释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区
拷贝算法
4.Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区
5.当OLD区空间不够时,JVM 会在OLD区进行完全的垃圾收集(0级)
6.完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory”错误
jvm启动参数http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
-Xms
初始堆大小|物理内存的1/64(<1GB)|优化后最好和xmx一样大这样不用重新分配
-Xmx
最大堆大小|物理内存的1/4(<1GB)|默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn
新生代大小|物理内存1/64?|注意:此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8|1.4后可以取代-XX:NewSize和-XX:MaxNewSize
-XX:PermSize
设置持久代(perm gen)初始值|物理内存的1/64
<span style="font-family: verdana, 'ms song', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 19.0909px; background-color: rgb(250, 247, 239);"><u><font color="#cfd0d2">-XX:MaxPermSize</font></u></span>
设置持久代最大值|物理内存的1/4|相对-XX:PermSize,慎用,以防出现java.lang.OutOfMemoryError: PermGen
-Xss
每个线程的堆栈大小|5.0以后1m|如果线程栈不是很深的情况下普遍128k足够,这里设置256k
<u><font color="#cfd0d2">-XX:ThreadStackSize</font></u>
这两个参数在1.6以前,都是谁设置在后面,谁就生效;1.6版本以后,-Xss设置在后面,则以-Xss为准,-XXThreadStackSize设置在后面,则主线程以-Xss为准,其它线程以-XX:ThreadStackSize为准
<font color="#cfd0d2">-XX:NewRatio</font>
年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)|Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。
-XX:SurvivorRatio
Survivor区和Eden区的大小比值||设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
。。。