Sun jdk 1.6内存管理 -调优篇-毕玄
-
Upload
- -
Category
Technology
-
view
773 -
download
0
Transcript of Sun jdk 1.6内存管理 -调优篇-毕玄
Measure - Factors
• GC Factors
– Footprint/Allocate Rate/LDS/Pause Time/Throughput
• APP Factors
– Response Time/QPS
• System Factors
– Load/CPU/IO
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.
Patterns
• Goal: 降低FGC执行的频率
• 可选方案– 增大old;
• 在不放大heap的情况下,可能会造成一些问题;
• 放大heap;
– 尽可能减少从new晋升到old的对象;• Tenuring Threshold、Survivor Space Size;
– 优化系统性能。
• Case Show!
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!
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!
References
• <Step by step GC Tuning> by Tony
• JDK 6 complete options