JVM优化

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

相关文章
相关标签/搜索