Sun JDK 1.6内存管理      使用篇        毕玄  2010-10、2010-11
目标• 掌握Sun JDK内存区域是如何划分和使用的• 掌握Sun JDK有哪些GC,怎么用,什么时候  触发• 掌握OOM的解决方法• 掌握如何监测GC的状况
内存管理• Explicit (例如C)  – 分配内存:malloc  – 释放内存:free• 优点  – 高效• 缺点  – 开发成本高
内存管理• Auto(例如Lisp、Java、.net、erLang)  – 语言本身来负责内存的分配和回收• 优点  – 开发效率高  – 避免内存分配bug• 缺点  – 不可预期的latency
内存管理• Java  – Garbage Collector     • Memory Allocate     • Memory Free         – Garbage Collection         – Garbage: 没有...
Sun JDK Memory Area         -Xss        局部变量区      本地方法栈PC寄     操作数栈                       -XX:PermSize –存器               ...
Sun JDK Memory Area• 方法栈 & 本地方法栈  – 线程创建时产生,方法执行时生成栈帧;• 方法区  – 存储类的元数据信息、常量等;• 堆  – Java代码中所有的new操作;• Native Memory(C Heap...
堆   -Xmn   New Generation      Eden                S0      S1   Old Generation              -XX:SurvivorRatio备注:通常将对新生代进行的...
目标• 掌握Sun JDK内存区域是如何划分和使用的• 掌握Sun JDK有哪些GC,怎么用,什么时候  触发• 掌握OOM的解决方法• 掌握如何监测GC的状况
Garbage Collector• Serial• Parallel  – YGC: Parallel Scavenge(PS)  – FGC: Parallel MSC(PSOld),Parallel    Compacting(ParOl...
Garbage Collector - Serial• Client模式下默认;• 可用-XX:+UseSerialGC强制使用。• 优点 – 对于Server应用而言,没看出有什么优点• 缺点 – 慢,不能充分发挥硬件资源
Garbage Collector - Serial    • 内存回收触发机制         – YGC                • eden空间不足;         – FGC                •   old空间不足...
Garbage Collector - Serial• 内存回收触发时发生了什么  – YGC    • 清空eden+from中所有no ref的对象占用的内存;    • 将eden+from中所有存活的对象copy到to中;    • 在...
Garbage Collector - Serial• 内存回收触发时发生了什么  – FGC    • 如配置了CollectGen0First,则先触发YGC;    • 清空heap中no ref的对象,permgen中已经被卸载的   ...
Garbage Collector - Serial• 细节参数  – -XX:SurvivorRatio=x,控制eden/s0/s1的大小;  – -XX:MaxTenuringThreshold,用于控制对象在新    生代存活的最大次数...
Garbage Collector - Parallel• Server模式下默认;  – YGC: PS FGC: Parallel MSC• 可用-XX:+UseParallelGC或-XX:+UseParallelOldGC  来强制指定...
Garbage Collector - Parallel• 内存回收触发机制  – YGC     • eden空间不足;  – FGC     •   old空间不足;     •   perm空间不足;     •   显示调用System...
Garbage Collector - Parallel• 内存回收触发时发生了什么  – YGC    • 和Serial所作的动作基本相同,不同的为多线程在做      这些动作;    • 另一步不同的动作为在YGC的最后不仅重新计算  ...
Garbage Collector - Parallel• 内存回收触发时发生了什么  – FGC     • 如配置了ScavengeBeforeFullGC(默认),则先触发YGC;     • MSC: 清空heap中no ref的对象,...
Garbage Collector - Parallel• 细节参数  – -XX:SurvivorRatio=x,控制eden/s0/s1的大小,含义    为eden:survivor space;  – -XX:MaxTenuringTh...
Garbage Collector - Concurrent• 可用-XX:+UseConcMarkSweepGC来强制指定;• 优点 – 在对Old进行回收时,对应用造成的暂停时间非   常短,适合对latency要求高的应用;• 缺点 – ...
Garbage Collector - Concurrent• 内存回收触发机制  – YGC     • eden空间不足;  – CMS GC     • Old Gen的使用到达一定的比率,默认为92%;     • 配置了CMSClas...
Garbage Collector - Concurrent• 内存回收触发时发生了什么  – YGC     • 和Serial动作完全相同,只是改为了采用多线程;  – CMS GC     • old gen到达比率时只清除old gen...
Garbage Collector - Concurrent• 细节参数  – -XX:CMSInitiatingOccupancyFraction,设置Old    Gen使用到达多少比率时触发;  – -XX:CMSInitiatingPe...
Garbage Collector - Summary•   import java.util.*;•   public class SummaryCase{•     public static void main(String[] args...
Garbage Collector – Future• Garbage First (G1)  – JDK 1.6 update 14 or JDK 7  – Few flags need to set     • -XX:MaxGCPause...
目标• 掌握Sun JDK内存区域是如何划分和使用的• 掌握Sun JDK有哪些GC,怎么用,什么时候  触发• 掌握OOM的解决方法• 掌握如何监测GC的状况
Memory Monitoring• 内存使用情况 – Heap & PermGen   • jstat –gc or jstat –gcutil   • jmap –heap – C Heap   • top or ps aux
Memory Monitoring• 谁用了内存 – Heap   • jmap –histo   • jmap –dump,then mat – C Heap   • google perftools
Memory Monitoring• GC的状况 – YGC/FGC的频率、耗时、回收的效果   • jstat –gcutil   • -XX:+PrintGCDetails –XX:+PrintGCDateStamps –     Xlog...
常见问题• OOM – Cases Show!  1、java -Xms20m -Xmx20m -Xmn10m -XX:+UseParallelGC     com. bluedavy.oom.JavaHeapSpaceCase1  2、jav...
常见问题• OOM Solution Pattern   – Java Heap Space       •   是不是heap太小了呢?       •   -XX:+HeapDumpOnOutOfMemoryError;       •  ...
常见问题• Write OOM Friendly Code  – 限制List/Set/Map/StringBuilder等的大小;  – 避免死循环;
常见问题• 长暂停  – 应用调优 or GC Tuning    • 详细请见调优篇。• GC占了应用运行的很多时间  – 同上• Case Show!
目标• 掌握Sun JDK内存区域是如何划分和使用的• 掌握Sun JDK有哪些GC,怎么用,什么时候  触发• 掌握OOM的解决方法• 掌握如何监测GC的状况
References•   Sun JDK Memory Management whitepaper•   老外正在写的一个OOM系列的文章•   两个OOM Cases排查过程的分享•   一个GC频繁的Case
Upcoming SlideShare
Loading in …5
×

Sun jdk 1.6内存管理 -使用篇-毕玄

1,502 views

Published on

0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,502
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
47
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

Sun jdk 1.6内存管理 -使用篇-毕玄

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

×