Sun jdk 1.6内存管理 -使用篇

12,788 views

Published on

Published in: Technology
  • 谢谢,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • thanks for your share.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Really good
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Thx for your share ....
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Sun jdk 1.6内存管理 -使用篇

  1. 1. Sun JDK 1.6内存管理使用篇<br />bluedavy<br />2010-10、2010-11<br />
  2. 2. 目标<br />掌握Sun JDK内存区域是如何划分和使用的<br />掌握Sun JDK有哪些GC,怎么用,什么时候触发<br />掌握OOM的解决方法<br />掌握如何监测GC的状况<br />
  3. 3. 内存管理<br />Explicit (例如C)<br />分配内存:malloc<br />释放内存:free<br />优点<br />高效<br />缺点<br />开发成本高<br />
  4. 4. 内存管理<br />Auto(例如Lisp、Java、.net、erLang)<br />语言本身来负责内存的分配和回收<br />优点<br />开发效率高<br />避免内存分配bug<br />缺点<br />不可预期的latency<br />
  5. 5. 内存管理<br />Java<br />Garbage Collector<br />Memory Allocate<br />Memory Free<br />Garbage Collection<br />Garbage: 没有被引用的对象<br />如忘记释放应该释放的<br />引用,就会<br />造成memory leak<br />
  6. 6. Sun JDK Memory Area<br />-Xss<br />PC寄存器<br />本地方法栈<br />局部变量区<br />-XX:PermSize –XX:MaxPermSize<br />操作数栈<br />方法区<br />栈帧<br />堆<br />方法栈<br />-Xms -Xmx<br />备注:在Sun JDK中本地方法栈和方法栈是同一个,因此也可用-Xss控制<br />
  7. 7. Sun JDK Memory Area<br />方法栈 & 本地方法栈<br />线程创建时产生,方法执行时生成栈帧;<br />方法区<br />存储类的元数据信息、常量等;<br />堆<br />Java代码中所有的new操作;<br />Native Memory(C Heap)<br />Direct ByteBuffer、JNI、Compile、GC;<br />
  8. 8. 堆<br />-Xmn<br />New Generation<br />Eden<br />S0<br />S1<br />Old Generation<br />-XX:SurvivorRatio<br />备注:通常将对新生代进行的回收称为Minor GC或Young GC;对旧生代进行的回收称为Major GC,但由于<br />Major GC除并发GC外均需对整个堆以及持久代进行扫描和回收,因此又称为Full GC。<br />
  9. 9. 目标<br />掌握Sun JDK内存区域是如何划分和使用的<br />掌握Sun JDK有哪些GC,怎么用,什么时候触发<br />掌握OOM的解决方法<br />掌握如何监测GC的状况<br />
  10. 10. Garbage Collector<br />Serial<br />Parallel<br />YGC: Parallel Scavenge(PS)<br />FGC: Parallel MSC(PSOld),Parallel Compacting(ParOld)<br />Concurrent<br />YGC: ParNew<br />FGC: CMS,fail then Serial MSC<br />
  11. 11. Garbage Collector - Serial<br />Client模式下默认;<br />可用-XX:+UseSerialGC强制使用。<br />优点<br />对于Server应用而言,没看出有什么优点<br />缺点<br />慢,不能充分发挥硬件资源<br />
  12. 12. Garbage Collector - Serial<br />内存回收触发机制<br />YGC<br />eden空间不足;<br />FGC<br />old空间不足;<br />perm空间不足;<br />显示调用System.gc() ,包括RMI等的定时触发;<br />YGC时的悲观策略;<br />dump live的内存信息时(jmap –dump:live)。<br />怎么看有没有触发:jstat或gc log<br />Case Show!1<br />1. case请从这里下载<br />
  13. 13. Garbage Collector - Serial<br />内存回收触发时发生了什么<br />YGC<br />清空eden+from中所有no ref的对象占用的内存;<br />将eden+from中所有存活的对象copy到to中;<br />在这个过程中一些对象将晋升到old中;<br />to放不下的;<br />存活次数超过tenuring threshold的。<br />重新计算Tenuring Threshold;<br />单线程做以上所有动作;<br />全过程暂停应用。<br />怎么看各个区域内存的变化:jstat –gcutil或gc log<br />Case Show!<br />
  14. 14. Garbage Collector - Serial<br />内存回收触发时发生了什么<br />FGC<br />如配置了CollectGen0First,则先触发YGC;<br />清空heap中no ref的对象,permgen中已经被卸载的classloader中加载的class的信息;<br />单线程做以上所有动作;<br />全过程暂停应用。<br />Case Show!<br />
  15. 15. Garbage Collector - Serial<br />细节参数<br />-XX:SurvivorRatio=x,控制eden/s0/s1的大小;<br />-XX:MaxTenuringThreshold,用于控制对象在新生代存活的最大次数;<br />-XX:PretenureSizeThreshold=x,控制超过多大字节的对象就在old上分配;<br />Case Show!<br />
  16. 16. Garbage Collector - Parallel<br />Server模式下默认;<br />YGC: PS FGC: Parallel MSC<br />可用-XX:+UseParallelGC或-XX:+UseParallelOldGC来强制指定;<br />ParallelGC代表FGC为Parallel MSC<br />ParallelOldGC代表FGC为Parallel Compacting<br />优点<br />高效;<br />缺点<br />当heap变大后,造成的暂停时间会变得比较长。<br />
  17. 17. Garbage Collector - Parallel<br />内存回收触发机制<br />YGC<br />eden空间不足;<br />FGC<br />old空间不足;<br />perm空间不足;<br />显示调用System.gc(),包括RMI等的定时触发;<br />YGC时的悲观策略;<br />YGC前 & YGC后<br />dump live的内存信息时(jmap –dump:live) 。<br />Case Show!<br />
  18. 18. Garbage Collector - Parallel<br />内存回收触发时发生了什么<br />YGC<br />和Serial所作的动作基本相同,不同的为多线程在做这些动作;<br />另一步不同的动作为在YGC的最后不仅重新计算Tenuring Threshold,还会重新调整Eden和From的大小。<br />Case Show!<br />
  19. 19. Garbage Collector - Parallel<br />内存回收触发时发生了什么<br />FGC<br />如配置了ScavengeBeforeFullGC(默认),则先触发YGC;<br />MSC: 清空heap中no ref的对象,permgen中已经被卸载的classloader中加载的class的信息,并进行压缩;<br />Compacting: 清空heap中部分no ref的对象,permgen中已经被卸载的classloader中加载的class的信息,并进行部分压缩;<br />多线程做以上动作。<br />Case Show!<br />
  20. 20. Garbage Collector - Parallel<br />细节参数<br />-XX:SurvivorRatio=x,控制eden/s0/s1的大小,含义为eden:survivor space;<br />-XX:MaxTenuringThreshold,用于控制对象在新生代存活的最大次数;<br />-XX:-UseAdaptiveSizePolicy,去掉YGC后动态调整eden、from以及tenuring threshold的动作;<br />-XX:ParallelGCThreads,设置并行的线程数;<br />Case Show!<br />
  21. 21. Garbage Collector – Concurrent1<br />可用-XX:+UseConcMarkSweepGC来强制指定;<br />优点<br />在对Old进行回收时,对应用造成的暂停时间非常短,适合对latency要求高的应用;<br />缺点<br />内存碎片和浮动垃圾;<br />Old区上的内存分配效率低;<br />回收的整个耗时比较长;<br />和应用争抢CPU;<br />1. jdk 6.0 update 23以前的版本中有一些会导致crash的bug: 6872049,6948538,6948539<br />
  22. 22. Garbage Collector - Concurrent<br />内存回收触发机制<br />YGC<br />eden空间不足;<br />CMS GC<br />Old Gen的使用到达一定的比率,默认为92%;<br />配置了CMSClassUnloadingEnabled,且Perm Gen的使用到达一定的比率,默认为92%;<br />Hotspot自己根据估计决定是否要触发;<br />在配置了ExplicitGCInvokesConcurrent的情况下显示调用了System.gc。<br />Full GC(Serial MSC)<br />Promotion Failed 或 Concurrent Mode Failure时;<br />Case Show!<br />
  23. 23. Garbage Collector - Concurrent<br />内存回收触发时发生了什么<br />YGC<br />和Serial动作完全相同,只是改为了采用多线程;<br />CMS GC<br />old gen到达比率时只清除old gen中no ref的对象所占用的空间;<br />perm gen到达比率时只清除已被清除的classloader加载的class信息;<br />FGC<br />和Serial动作完全相同。<br />Case Show!<br />
  24. 24. Garbage Collector - Concurrent<br />细节参数<br />-XX:CMSInitiatingOccupancyFraction,设置Old Gen使用到达多少比率时触发;<br />-XX:CMSInitiatingPermOccupancyFraction,设置Perm Gen使用到达多少比率时触发;<br />-XX:+UseCMSInitiatingOccupancyOnly,禁止hotspot自行触发CMS GC;<br />Case Show!<br />
  25. 25. Garbage Collector - Summary<br />import java.util.*;<br />public class SummaryCase{<br /> public static void main(String[] args) {<br /> List<Object> caches=new ArrayList<Object>();<br /> for(inti=0;i<7;i++){<br />caches.add(new byte[1024*1024*3]);<br /> }<br />caches.clear();<br /> for(inti=0;i<2;i++){<br />caches.add(new byte[1024*1024*3]);<br /> }<br /> }<br />}<br />用以下两种参数执行,会执行几次minor gc和几次full gc呢?<br />-Xms30m -Xmx30m -Xmn10m -XX:+UseParallelGC<br />-Xms30m -Xmx30m -Xmn10m -XX:+UseSerialGC<br />
  26. 26. Garbage Collector – Future<br />Garbage First (G1)<br />JDK 1.6 update 14 or JDK 7<br />Few flags need to set<br />-XX:MaxGCPauseMillis=100 -XX:GCPauseIntervalMillis=6000<br />
  27. 27. 目标<br />掌握Sun JDK内存区域是如何划分和使用的<br />掌握Sun JDK有哪些GC,怎么用,什么时候触发<br />掌握OOM的解决方法<br />掌握如何监测GC的状况<br />
  28. 28. Memory Monitoring<br />内存使用情况<br />Heap & PermGen<br />jstat –gc or jstat –gcutil<br />jmap–heap<br />C Heap<br />top or ps aux<br />
  29. 29. Memory Monitoring<br />谁用了内存<br />Heap<br />jmap –histo<br />jmap –dump,then mat<br />C Heap<br />googleperftools<br />
  30. 30. Memory Monitoring<br />GC的状况<br />YGC/FGC的频率、耗时、回收的效果<br />jstat –gcutil<br />-XX:+PrintGCDetails –XX:+PrintGCDateStamps –Xloggc:<file><br />
  31. 31. 常见问题<br />OOM<br />Cases Show!<br />1、java -Xms20m -Xmx20m -Xmn10m -XX:+UseParallelGC<br /> com. bluedavy.oom.JavaHeapSpaceCase1<br />2、java -Xms20m -Xmx20m -Xmn10m <br /> -XX:+HeapDumpOnOutOfMemoryError<br /> com.bluedavy.oom.JavaHeapSpaceCase2<br />3、同上的启动参数执行com.bluedavy.oom.JavaHeapSpaceCase3<br />4、同上的启动参数执行com.bluedavy.oom.JavaHeapSpaceCase4<br />5、java -Xms1536m -Xmx1536m -Xss100m com.bluedavy.oom.CannotCreateThreadCase<br />6、java –Xmn10m –Xms1536m –Xmx1536m NativeMemoryOOMCase<br />
  32. 32. 常见问题<br />OOM Solution Pattern<br />Java Heap Space<br />是不是heap太小了呢?<br />-XX:+HeapDumpOnOutOfMemoryError;<br />jmap –histo多看几次;<br />jmap –dump1;<br />再不行就人肉。<br />Out of Swap<br />堆开太大了?<br />googleperftools<br />unable to create new native thread<br />线程太多了? -Xss太大了?<br />PermGen Space<br />permgen太小了?<br />ClassLoader太多了?泄露?<br />1. jdk 6.0 update 23以前的版本中有这个bug: http://goo.gl/nmTB8<br />
  33. 33. 常见问题<br />Write OOM Friendly Code<br />限制List/Set/Map/StringBuilder等的大小;<br />避免死循环;<br />
  34. 34. 常见问题<br />长暂停<br />应用调优 or GC Tuning<br />详细请见调优篇。<br />GC占了应用运行的很多时间<br />同上<br />Case Show!<br />
  35. 35. 目标<br />掌握Sun JDK内存区域是如何划分和使用的<br />掌握Sun JDK有哪些GC,怎么用,什么时候触发<br />掌握OOM的解决方法<br />掌握如何监测GC的状况<br />
  36. 36. References<br />Sun JDK Memory Management whitepaper<br />老外正在写的一个OOM系列的文章<br />

×