Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Sun jdk 1.6内存管理 -使用篇

12,867 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 />

×