Sun jdk 1.6内存管理 -调优篇-毕玄

25
Sun JDK 1.6 内存管理 调优篇 毕玄 2010-102010-11

Transcript of Sun jdk 1.6内存管理 -调优篇-毕玄

Sun JDK 1.6 内存管理调优篇

毕玄

2010-10、2010-11

目标

• 掌握一些GC调优的基本技巧和模式

• 如何编写对GC友好的代码

Steps

Measure

Set GoalTuning

Measure - Factors

• GC Factors

– Footprint/Allocate Rate/LDS/Pause Time/Throughput

• APP Factors

– Response Time/QPS

• System Factors

– Load/CPU/IO

Measure - Tools

• GC Log

• jstat

• jmap

• sar

• top

• Case Show!

GC Myth

来源于JavaOne2010 The Garbage Collector Mythbusters Session

Tuning Goal

Throughput Latency

JVM Choice

• 32 bit

– 在linux上有3G地址空间的限制;

– 通常而言分配给JVM堆最好控制在2G以下;

• 64 bit

– pointer占用内存更多

• 最好开启-XX:+UseCompressedOOPS

– 如机器内存和CPU都满足的情况下,64 bit is the better choice。

GC Choice

• Throughput more important

– ParallelOldGC

• Latencies more important

– Usually ParallelOldGC first,if not satisfied then CMS.

Footprint

• Heap Size Starting Point

• Calculate Live Data Size

– Set –Xms,-Xmx to 3x to 4x LDS

Patterns

• Goal: 降低FGC执行的频率

• 可选方案– 增大old;

• 在不放大heap的情况下,可能会造成一些问题;

• 放大heap;

– 尽可能减少从new晋升到old的对象;• Tenuring Threshold、Survivor Space Size;

– 优化系统性能。

• Case Show!

Patterns

• Goal: 降低FGC执行的频率

– 我们的case

• ItemDetail

• TC

• promotioncenter

Patterns

• Goal: 减小FGC造成的暂停时间

• 可选方案

– 减小Heap;

– GC换为CMS;

– 升级或增加CPU。

• Case Show!

Patterns

• Goal: 减小FGC造成的暂停时间

– 我们的case

• htcvstore

• TM on 64 bit

Patterns

• Goal: 降低YGC的执行频率

• 可选方案

– 增大新生代;

• 有可能造成FGC频繁。

– 优化系统性能。

Patterns

• Goal: 缩短YGC造成的暂停时间

• 可选方案

– 减小新生代;

• 有可能会造成new晋升到old的对象增加;

– 增加或升级CPU。

Experiences

• ParallelOldGC Tuning

– 根据应用决定是否要启用AdaptiveSizePolicy

– Use NUMA

Experiences

• CMS GC Tuning– Tenuring Threshold Tuning

• MTT越大,晋升到old的对象可能越少,同时可能会导致YGC耗时变长;

• MTT越小,晋升到old的对象可能越多,同时可能会使得YGC耗时变短,但也就造成了old的GC更频繁,对于CMS而言,还会造成更多的内存碎片。

• Best behavior: bytes surviving per age decrease as age increases.

– Survivor Size Tuning• 当太多对象晋升到Old时,可能会造成YGC耗时变长,此时应考虑适当放大Survivor Size;

Experiences

• CMS GC Tuning

– 碎片监测

• -XX:PrintFLSStatiscis=2 –XX:+PrintCMSStatiscis

– GC Cycle Initiation Tuning

• LDS & allocate rate,不能太频繁,也不能太晚

Experiences

• CMS GC Tuning

– 最重要的

• 不要出现promotion failed和concurrent mode failure。

• promotion failed

– 降低触发比率;

– 增大survivor space或old;

• concurrent mode failure

– 降低触发比率;

– 增大old;

Experiences

• CMS GC Tuning– 不同case不同策略

• 如YGC后存活的对象较少,可以考虑调小survivor space以及tenuring threshold,以降低YGC的执行频率和耗时;

• 如YGC后存活的对象较多,则需要调小新生代,调大Survivor Space,尽可能减少晋升到Old的对象,此时如晋升的太多,则会出现YGC耗时比较长,且CMS GC频繁的现象。

• Case Show!

目标

• 掌握一些GC调优的基本技巧和模式

• 如何编写对GC友好的代码

Write GC-Friendly Code

• 避免Autobox产生浪费;• 合理控制数据结构的大小,例如List、Map、

StringBuilder等;• 合理使用Reference;• 不要使用Finalizers来回收资源;

– no guarantees when they will be run,or that they will not run at all.

• 更好的处理read-only的数据。

• Case Show!

目标

• 掌握一些GC调优的基本技巧和模式

• 如何编写对GC友好的代码

References

• <Step by step GC Tuning> by Tony

• JDK 6 complete options