1. 堆栈大小设置
html
JVM内存大小=年轻代大小(包括Eden和两个Survivor区) + 年老代大小 + 持久代大小java
-Xmx JVM最大可用内存多线程
-Xms初始内存 JVM优化并发
-Xmn年轻代大小oracle
-Xss每一个线程的堆栈大小ide
-XX:NewRatio 年轻与年老的比值优化
-XX:SurvivorRatio 一个Survivor与eden的比值,若是=4 一个Survivor占年轻代的1/6spa
-XX:MaxPermSize设置持久代大小线程
堆与栈日志
栈是运行时的单位,而堆是存储的单位。
2. Young回收器选择:
Serial:串行
Parrel New:多线程,相似于串行
Parrel Scavenge:吞吐量优先,经过GCTimeRatio设置gc占用cpu比例(19:1/(1+19))
UseAdaptiveSizePolicy不适于ParrelNew,仅在UseParrelGC/UseParrelOldGC使用
3. old回收器选择
Serial Old:
CMS:
Parrel Old:
当虚拟机参数为UseParrelGC:Parrel Scavenge+Serial Old
当虚拟机参数为UseParrelOldGC:Parrel Scavenge+Parrel Old
当虚拟机参数为UseConcMarkSweepGC:Parrel New+CMS
4. 辅助信息
-XX:+PrintGC
输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs]
[Full GC 121376K->10414K(130112K), 0.0650971 secs]
-XX:+PrintGCDetails
输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
DefNew: 8614K->781K(9088K):新生代回收状况(Eden+1Survivor)
118250K->113543K(130112K):整个Heap(Eden+1Survivor+Old) 回收状况及大小
DefNew:是使用-XX:+UseSerialGC(新生代,老年代都使用串行回收收集器)。
ParNew:是使用-XX:+UseParNewGC(新生代使用并行收集器,老年代使用串行回收收集器)或者-XX:+UseConcMarkSweepGC(新生代使用并行收集器,老年代使用CMS)。
PSYoungGen:是使用-XX:+UseParallelOldGC(新生代,老年代都使用并行回收收集器)或者-XX:+UseParallelGC(新生代使用并行回收收集器,老年代使用串行收集器)
garbage-first heap:是使用-XX:+UseG1GC(G1收集器)
-XX:+PrintGCTimeStamps(GC发生的时间)
-XX:+PrintGCApplicationStoppedTime(GC消耗了多少时间)
-XX:+PrintGCApplicationConcurrentTime(GC之间运行了多少时间)
-Xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析。
PrintHeapAtGC会打印Heap信息
5. 总结
1. MTT与TargetSurvivorRatio
查看jstat -gcnew 会有两列信息 TT MTT
TT:tenure threshold,通过minor gc次数 仍然没有被回收 则晋升到old
MTT:max tt,tt会根据age自动计算,下一次min gc的tt,是age与mtt的最小值
age:每一个对象有4bit用于存储 min gc后的存活次数,min gc发生后会统计各个age阶段所占suvivor的比率,若是某个age的对象大小之和大于TargetSurvivorRatio(有个计算公式,这个参数是比率),并且还没到mtt,则tt设置为age
TargetSurvivorRatio默认50%,因此调大 有利于对象在young回收,可是设置过大,长期存在的对象会反复被拷贝,因此须要一个权衡。
加入-XX:+PrintTenuringDistribution能够查看minor gc时 各个age的对象大小
2. 年老代大小选择
响应时间优先的应用:年老代使用并发收集器,因此其大小须要当心设置,通常要考虑并发会话率和会话持续时间等一些参数。若是堆设置小了,能够会形成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;若是堆大了,则须要较长的收集时间。最优化的方案,通常须要参考如下数据得到:
并发垃圾收集信息
持久代并发收集次数
传统GC信息
3.花在年轻代和年老代回收上的时间比例
减小年轻代和年老代花费的时间,通常会提升应用的效率
吞吐量优先的应用:通常吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。缘由是,这样能够尽量回收掉大部分短时间对象,减小中期的对象,而年老代尽存放长期存活对象。
参考文档:
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
http://www.iteye.com/topic/91905
http://www.iteye.com/topic/473874
http://www.tikalk.com/java/garbage-collection-serial-vs-parallel-vs-concurrent-mark-sweep
http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html