More Related Content Similar to Sun jdk 1.6内存管理 -使用篇-毕玄 (20) Sun jdk 1.6内存管理 -使用篇-毕玄5. 内存管理
• Java
– Garbage Collector
• Memory Allocate
• Memory Free
– Garbage Collection
– Garbage: 没有被引用的对象
» 如忘记释放应该释放的
引用,就会
造成memory leak
6. Sun JDK Memory Area
-Xss
局部变量区 本地方法栈
PC寄 操作数栈 -XX:PermSize –
存器 方法区 XX:MaxPermSize
栈帧
方法栈 堆 -Xms -Xmx
备注:在Sun JDK中本地方法栈和方法栈是同一个,因此也可用-Xss控制
7. Sun JDK Memory Area
• 方法栈 & 本地方法栈
– 线程创建时产生,方法执行时生成栈帧;
• 方法区
– 存储类的元数据信息、常量等;
• 堆
– Java代码中所有的new操作;
• Native Memory(C Heap)
– Direct ByteBuffer、JNI、Compile、GC;
8. 堆
-Xmn New Generation
Eden S0 S1 Old Generation
-XX:SurvivorRatio
备注:通常将对新生代进行的回收称为Minor GC或Young GC;对旧生代进行的回收称为Major GC,但由于
Major GC除并发GC外均需对整个堆以及持久代进行扫描和回收,因此又称为Full GC。
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. Garbage Collector - Serial
• Client模式下默认;
• 可用-XX:+UseSerialGC强制使用。
• 优点
– 对于Server应用而言,没看出有什么优点
• 缺点
– 慢,不能充分发挥硬件资源
12. Garbage Collector - Serial
• 内存回收触发机制
– YGC
• eden空间不足;
– FGC
• old空间不足;
• perm空间不足;
• 显示调用System.gc() ,包括RMI等的定时触发;
• YGC时的悲观策略;
• dump live的内存信息时(jmap –dump:live)。
• 怎么看有没有触发:jstat 或gc log
• Case Show!1
1. case请从这里下载
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. Garbage Collector - Serial
• 内存回收触发时发生了什么
– FGC
• 如配置了CollectGen0First,则先触发YGC;
• 清空heap中no ref的对象,permgen中已经被卸载的
classloader中加载的class的信息;
• 单线程做以上所有动作;
• 全过程暂停应用。
• Case Show!
15. Garbage Collector - Serial
• 细节参数
– -XX:SurvivorRatio=x,控制eden/s0/s1的大小;
– -XX:MaxTenuringThreshold,用于控制对象在新
生代存活的最大次数;
– -XX:PretenureSizeThreshold=x,控制超过多大字
节的对象就在old上分配;
• Case Show!
16. Garbage Collector - Parallel
• Server模式下默认;
– YGC: PS FGC: Parallel MSC
• 可用-XX:+UseParallelGC或-XX:+UseParallelOldGC
来强制指定;
– ParallelGC代表FGC为Parallel MSC
– ParallelOldGC代表FGC为Parallel Compacting
• 优点
– 高效;
• 缺点
– 当heap变大后,造成的暂停时间会变得比较长。
17. Garbage Collector - Parallel
• 内存回收触发机制
– YGC
• eden空间不足;
– FGC
• old空间不足;
• perm空间不足;
• 显示调用System.gc(),包括RMI等的定时触发;
• YGC时的悲观策略;
– YGC前 & YGC后
• dump live的内存信息时(jmap –dump:live) 。
• Case Show!
18. Garbage Collector - Parallel
• 内存回收触发时发生了什么
– YGC
• 和Serial所作的动作基本相同,不同的为多线程在做
这些动作;
• 另一步不同的动作为在YGC的最后不仅重新计算
Tenuring Threshold,还会重新调整Eden和From的大
小。
• Case Show!
19. Garbage Collector - Parallel
• 内存回收触发时发生了什么
– FGC
• 如配置了ScavengeBeforeFullGC(默认),则先触发YGC;
• MSC: 清空heap中no ref的对象,permgen中已经被卸载的
classloader中加载的class的信息,并进行压缩;
• Compacting: 清空heap中部分no ref的对象, permgen中已
经被卸载的classloader中加载的class的信息,并进行部分
压缩;
• 多线程做以上动作。
• Case Show!
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. Garbage Collector - Concurrent
• 可用-XX:+UseConcMarkSweepGC来强制指定;
• 优点
– 在对Old进行回收时,对应用造成的暂停时间非
常短,适合对latency要求高的应用;
• 缺点
– 内存碎片和浮动垃圾;
– Old区上的内存分配效率低;
– 回收的整个耗时比较长;
– 和应用争抢CPU;
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. Garbage Collector - Concurrent
• 内存回收触发时发生了什么
– YGC
• 和Serial动作完全相同,只是改为了采用多线程;
– CMS GC
• old gen到达比率时只清除old gen中no ref的对象所占用的
空间;
• perm gen到达比率时只清除已被清除的classloader加载的
class信息;
– FGC
• 和Serial动作完全相同。
• Case Show!
24. Garbage Collector - Concurrent
• 细节参数
– -XX:CMSInitiatingOccupancyFraction,设置Old
Gen使用到达多少比率时触发;
– -XX:CMSInitiatingPermOccupancyFraction,设置
Perm Gen使用到达多少比率时触发;
– -XX:+UseCMSInitiatingOccupancyOnly ,禁止
hotspot自行触发CMS GC;
• Case Show!
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. 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
30. Memory Monitoring
• GC的状况
– YGC/FGC的频率、耗时、回收的效果
• jstat –gcutil
• -XX:+PrintGCDetails –XX:+PrintGCDateStamps –
Xloggc:<file>
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. 常见问题
• 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太多了?泄露?
34. 常见问题
• 长暂停
– 应用调优 or GC Tuning
• 详细请见调优篇。
• GC占了应用运行的很多时间
– 同上
• Case Show!
36. References
• Sun JDK Memory Management whitepaper
• 老外正在写的一个OOM系列的文章
• 两个OOM Cases排查过程的分享
• 一个GC频繁的Case