SlideShare una empresa de Scribd logo
1 de 36
Sun JDK 1.6内存管理使用篇 bluedavy 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: 没有被引用的对象 如忘记释放应该释放的 引用,就会 造成memory leak
Sun JDK Memory Area -Xss PC寄存器 本地方法栈 局部变量区 -XX:PermSize –XX:MaxPermSize 操作数栈 方法区 栈帧 堆 方法栈 -Xms -Xmx 备注:在Sun JDK中本地方法栈和方法栈是同一个,因此也可用-Xss控制
Sun JDK Memory Area 方法栈 & 本地方法栈 线程创建时产生,方法执行时生成栈帧; 方法区 存储类的元数据信息、常量等; 堆 Java代码中所有的new操作; Native Memory(C Heap) Direct ByteBuffer、JNI、Compile、GC;
堆 -Xmn New Generation Eden S0 S1 Old Generation -XX:SurvivorRatio 备注:通常将对新生代进行的回收称为Minor GC或Young GC;对旧生代进行的回收称为Major GC,但由于 Major GC除并发GC外均需对整个堆以及持久代进行扫描和回收,因此又称为Full GC。
目标 掌握Sun JDK内存区域是如何划分和使用的 掌握Sun JDK有哪些GC,怎么用,什么时候触发 掌握OOM的解决方法 掌握如何监测GC的状况
Garbage Collector Serial Parallel YGC: Parallel Scavenge(PS) FGC: Parallel MSC(PSOld),Parallel Compacting(ParOld) Concurrent YGC: ParNew FGC: CMS,fail then Serial MSC
Garbage Collector - Serial Client模式下默认; 可用-XX:+UseSerialGC强制使用。 优点 对于Server应用而言,没看出有什么优点 缺点 慢,不能充分发挥硬件资源
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请从这里下载
Garbage Collector - Serial 内存回收触发时发生了什么 YGC 清空eden+from中所有no ref的对象占用的内存; 将eden+from中所有存活的对象copy到to中; 在这个过程中一些对象将晋升到old中; to放不下的; 存活次数超过tenuring threshold的。 重新计算Tenuring Threshold; 单线程做以上所有动作; 全过程暂停应用。 怎么看各个区域内存的变化:jstat –gcutil或gc log Case Show!
Garbage Collector - Serial 内存回收触发时发生了什么 FGC 如配置了CollectGen0First,则先触发YGC; 清空heap中no ref的对象,permgen中已经被卸载的classloader中加载的class的信息; 单线程做以上所有动作; 全过程暂停应用。 Case Show!
Garbage Collector - Serial 细节参数 -XX:SurvivorRatio=x,控制eden/s0/s1的大小; -XX:MaxTenuringThreshold,用于控制对象在新生代存活的最大次数; -XX:PretenureSizeThreshold=x,控制超过多大字节的对象就在old上分配; Case Show!
Garbage Collector - Parallel Server模式下默认; YGC: PS   FGC: Parallel MSC 可用-XX:+UseParallelGC或-XX:+UseParallelOldGC来强制指定; ParallelGC代表FGC为Parallel MSC ParallelOldGC代表FGC为Parallel Compacting 优点 高效; 缺点 当heap变大后,造成的暂停时间会变得比较长。
Garbage Collector - Parallel 内存回收触发机制 YGC eden空间不足; FGC old空间不足; perm空间不足; 显示调用System.gc(),包括RMI等的定时触发; YGC时的悲观策略; YGC前 & YGC后 dump live的内存信息时(jmap –dump:live) 。 Case Show!
Garbage Collector - Parallel 内存回收触发时发生了什么 YGC 和Serial所作的动作基本相同,不同的为多线程在做这些动作; 另一步不同的动作为在YGC的最后不仅重新计算Tenuring Threshold,还会重新调整Eden和From的大小。 Case Show!
Garbage Collector - Parallel 内存回收触发时发生了什么 FGC 如配置了ScavengeBeforeFullGC(默认),则先触发YGC; MSC: 清空heap中no ref的对象,permgen中已经被卸载的classloader中加载的class的信息,并进行压缩; Compacting: 清空heap中部分no ref的对象,permgen中已经被卸载的classloader中加载的class的信息,并进行部分压缩; 多线程做以上动作。 Case Show!
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!
Garbage Collector – Concurrent1 可用-XX:+UseConcMarkSweepGC来强制指定; 优点 在对Old进行回收时,对应用造成的暂停时间非常短,适合对latency要求高的应用; 缺点 内存碎片和浮动垃圾; Old区上的内存分配效率低; 回收的整个耗时比较长; 和应用争抢CPU; 1. jdk 6.0 update 23以前的版本中有一些会导致crash的bug: 6872049,6948538,6948539
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!
Garbage Collector - Concurrent 内存回收触发时发生了什么 YGC 和Serial动作完全相同,只是改为了采用多线程; CMS GC old gen到达比率时只清除old gen中no ref的对象所占用的空间; perm gen到达比率时只清除已被清除的classloader加载的class信息; FGC 和Serial动作完全相同。 Case Show!
Garbage Collector - Concurrent 细节参数 -XX:CMSInitiatingOccupancyFraction,设置Old Gen使用到达多少比率时触发; -XX:CMSInitiatingPermOccupancyFraction,设置Perm Gen使用到达多少比率时触发; -XX:+UseCMSInitiatingOccupancyOnly,禁止hotspot自行触发CMS GC; Case Show!
Garbage Collector - Summary import java.util.*; public class SummaryCase{    public static void main(String[] args) {       List<Object> caches=new ArrayList<Object>();       for(inti=0;i<7;i++){ caches.add(new byte[1024*1024*3]);       } caches.clear();       for(inti=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
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
目标 掌握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 googleperftools
Memory Monitoring GC的状况 YGC/FGC的频率、耗时、回收的效果 jstat –gcutil -XX:+PrintGCDetails –XX:+PrintGCDateStamps –Xloggc:<file>
常见问题 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
常见问题 OOM Solution Pattern Java Heap Space 是不是heap太小了呢? -XX:+HeapDumpOnOutOfMemoryError; jmap –histo多看几次; jmap –dump1; 再不行就人肉。 Out of Swap 堆开太大了? googleperftools unable to  create new native thread 线程太多了? -Xss太大了? PermGen Space permgen太小了? ClassLoader太多了?泄露? 1. jdk 6.0 update 23以前的版本中有这个bug: http://goo.gl/nmTB8
常见问题 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系列的文章

Más contenido relacionado

La actualidad más candente

JVM内容管理和垃圾回收
JVM内容管理和垃圾回收JVM内容管理和垃圾回收
JVM内容管理和垃圾回收Tony Deng
 
Jvm基础调优实践(v1.0)
Jvm基础调优实践(v1.0)Jvm基础调优实践(v1.0)
Jvm基础调优实践(v1.0)ddviplinux
 
C1000K高性能服务器构建技术
C1000K高性能服务器构建技术C1000K高性能服务器构建技术
C1000K高性能服务器构建技术Feng Yu
 
Mysql fast share
Mysql fast shareMysql fast share
Mysql fast sharerfyiamcool
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)wang hongjiang
 
Sun jdk 1.6内存管理 -使用篇-毕玄
Sun jdk 1.6内存管理 -使用篇-毕玄Sun jdk 1.6内存管理 -使用篇-毕玄
Sun jdk 1.6内存管理 -使用篇-毕玄锐 张
 
MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB
 
Lamp优化实践
Lamp优化实践Lamp优化实践
Lamp优化实践zhliji2
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战rfyiamcool
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Kris Mok
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计锐 张
 
Btrace intro(撒迦)
Btrace intro(撒迦)Btrace intro(撒迦)
Btrace intro(撒迦)ykdsg
 
高性能LAMP程序设计
高性能LAMP程序设计高性能LAMP程序设计
高性能LAMP程序设计fuchaoqun
 
系统性能分析和优化.ppt
系统性能分析和优化.ppt系统性能分析和优化.ppt
系统性能分析和优化.pptFrank Cai
 
淘宝网前台应用性能优化实践
淘宝网前台应用性能优化实践淘宝网前台应用性能优化实践
淘宝网前台应用性能优化实践丁 宇
 

La actualidad más candente (20)

JVM及其调优
JVM及其调优JVM及其调优
JVM及其调优
 
JVM内容管理和垃圾回收
JVM内容管理和垃圾回收JVM内容管理和垃圾回收
JVM内容管理和垃圾回收
 
Jvm基础调优实践(v1.0)
Jvm基础调优实践(v1.0)Jvm基础调优实践(v1.0)
Jvm基础调优实践(v1.0)
 
C1000K高性能服务器构建技术
C1000K高性能服务器构建技术C1000K高性能服务器构建技术
C1000K高性能服务器构建技术
 
Sun jdk 1.6 gc
Sun jdk 1.6 gcSun jdk 1.6 gc
Sun jdk 1.6 gc
 
Mysql fast share
Mysql fast shareMysql fast share
Mysql fast share
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)
 
Sun jdk 1.6内存管理 -使用篇-毕玄
Sun jdk 1.6内存管理 -使用篇-毕玄Sun jdk 1.6内存管理 -使用篇-毕玄
Sun jdk 1.6内存管理 -使用篇-毕玄
 
MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB at Qihoo 360
MongoDB at Qihoo 360
 
Lamp优化实践
Lamp优化实践Lamp优化实践
Lamp优化实践
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)
 
Jvm内存管理基础
Jvm内存管理基础Jvm内存管理基础
Jvm内存管理基础
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计
 
Aswan&hump
Aswan&humpAswan&hump
Aswan&hump
 
Btrace intro(撒迦)
Btrace intro(撒迦)Btrace intro(撒迦)
Btrace intro(撒迦)
 
高性能LAMP程序设计
高性能LAMP程序设计高性能LAMP程序设计
高性能LAMP程序设计
 
Ali-tomcat
Ali-tomcatAli-tomcat
Ali-tomcat
 
系统性能分析和优化.ppt
系统性能分析和优化.ppt系统性能分析和优化.ppt
系统性能分析和优化.ppt
 
淘宝网前台应用性能优化实践
淘宝网前台应用性能优化实践淘宝网前台应用性能优化实践
淘宝网前台应用性能优化实践
 

Destacado

Performance optimization techniques for Java code
Performance optimization techniques for Java codePerformance optimization techniques for Java code
Performance optimization techniques for Java codeAttila Balazs
 
Java Performance Tuning
Java Performance TuningJava Performance Tuning
Java Performance TuningMinh Hoang
 
Introduction of Java GC Tuning and Java Java Mission Control
Introduction of Java GC Tuning and Java Java Mission ControlIntroduction of Java GC Tuning and Java Java Mission Control
Introduction of Java GC Tuning and Java Java Mission ControlLeon Chen
 
Jvm Performance Tunning
Jvm Performance TunningJvm Performance Tunning
Jvm Performance TunningTerry Cho
 

Destacado (6)

Performance optimization techniques for Java code
Performance optimization techniques for Java codePerformance optimization techniques for Java code
Performance optimization techniques for Java code
 
Java Performance Tuning
Java Performance TuningJava Performance Tuning
Java Performance Tuning
 
Memory leak
Memory leakMemory leak
Memory leak
 
Memory Leak In java
Memory Leak In javaMemory Leak In java
Memory Leak In java
 
Introduction of Java GC Tuning and Java Java Mission Control
Introduction of Java GC Tuning and Java Java Mission ControlIntroduction of Java GC Tuning and Java Java Mission Control
Introduction of Java GC Tuning and Java Java Mission Control
 
Jvm Performance Tunning
Jvm Performance TunningJvm Performance Tunning
Jvm Performance Tunning
 

Similar a Sun jdk 1.6内存管理 -使用篇

Sun jdk-1.6-gc
Sun jdk-1.6-gcSun jdk-1.6-gc
Sun jdk-1.6-gc锐 张
 
Jvm那些事
Jvm那些事Jvm那些事
Jvm那些事dynamiclu
 
Mybatis学习培训
Mybatis学习培训Mybatis学习培训
Mybatis学习培训flynofry
 
C++工程实践
C++工程实践C++工程实践
C++工程实践Shuo Chen
 
Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Harvey Zhang
 
手机之家的数据访问层实践
手机之家的数据访问层实践手机之家的数据访问层实践
手机之家的数据访问层实践guestf5121c
 
手机之家的数据访问层实践
手机之家的数据访问层实践手机之家的数据访问层实践
手机之家的数据访问层实践xcq
 
Osc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOsc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOpenSourceCamp
 
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用FLASH开发者交流会
 
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410maclean liu
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
Jvm memory
Jvm memoryJvm memory
Jvm memorybenewu
 
FtnApp 的缩略图实践
FtnApp 的缩略图实践FtnApp 的缩略图实践
FtnApp 的缩略图实践Frank Xu
 
Golang advance
Golang advanceGolang advance
Golang advancerfyiamcool
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocketpwesh
 
CKAN 技術介紹 (開發篇)
CKAN 技術介紹 (開發篇)CKAN 技術介紹 (開發篇)
CKAN 技術介紹 (開發篇)Chengjen Lee
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUGYingSiang Geng
 

Similar a Sun jdk 1.6内存管理 -使用篇 (20)

Sun jdk-1.6-gc
Sun jdk-1.6-gcSun jdk-1.6-gc
Sun jdk-1.6-gc
 
Jvm那些事
Jvm那些事Jvm那些事
Jvm那些事
 
Tcfsh bootcamp day2
 Tcfsh bootcamp day2 Tcfsh bootcamp day2
Tcfsh bootcamp day2
 
Mybatis学习培训
Mybatis学习培训Mybatis学习培训
Mybatis学习培训
 
C++工程实践
C++工程实践C++工程实践
C++工程实践
 
Glider
GliderGlider
Glider
 
Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化
 
手机之家的数据访问层实践
手机之家的数据访问层实践手机之家的数据访问层实践
手机之家的数据访问层实践
 
手机之家的数据访问层实践
手机之家的数据访问层实践手机之家的数据访问层实践
手机之家的数据访问层实践
 
Osc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOsc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresql
 
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
 
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
Jvm memory
Jvm memoryJvm memory
Jvm memory
 
FtnApp 的缩略图实践
FtnApp 的缩略图实践FtnApp 的缩略图实践
FtnApp 的缩略图实践
 
Golang advance
Golang advanceGolang advance
Golang advance
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocket
 
老舊web上雲端
老舊web上雲端老舊web上雲端
老舊web上雲端
 
CKAN 技術介紹 (開發篇)
CKAN 技術介紹 (開發篇)CKAN 技術介紹 (開發篇)
CKAN 技術介紹 (開發篇)
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
 

Más de bluedavy lin

Java memory problem cases solutions
Java memory problem cases solutionsJava memory problem cases solutions
Java memory problem cases solutionsbluedavy lin
 
Hbase简介与实践分享
Hbase简介与实践分享Hbase简介与实践分享
Hbase简介与实践分享bluedavy lin
 
Sun jdk 1.6 gc english version
Sun jdk 1.6 gc english versionSun jdk 1.6 gc english version
Sun jdk 1.6 gc english versionbluedavy lin
 
OSGi理论与实战
OSGi理论与实战OSGi理论与实战
OSGi理论与实战bluedavy lin
 

Más de bluedavy lin (6)

Java memory problem cases solutions
Java memory problem cases solutionsJava memory problem cases solutions
Java memory problem cases solutions
 
Hbase简介与实践分享
Hbase简介与实践分享Hbase简介与实践分享
Hbase简介与实践分享
 
菜鸟看Hbase
菜鸟看Hbase菜鸟看Hbase
菜鸟看Hbase
 
JavaOne summary
JavaOne summaryJavaOne summary
JavaOne summary
 
Sun jdk 1.6 gc english version
Sun jdk 1.6 gc english versionSun jdk 1.6 gc english version
Sun jdk 1.6 gc english version
 
OSGi理论与实战
OSGi理论与实战OSGi理论与实战
OSGi理论与实战
 

Sun jdk 1.6内存管理 -使用篇

  • 1. Sun JDK 1.6内存管理使用篇 bluedavy 2010-10、2010-11
  • 2. 目标 掌握Sun JDK内存区域是如何划分和使用的 掌握Sun JDK有哪些GC,怎么用,什么时候触发 掌握OOM的解决方法 掌握如何监测GC的状况
  • 3. 内存管理 Explicit (例如C) 分配内存:malloc 释放内存:free 优点 高效 缺点 开发成本高
  • 4. 内存管理 Auto(例如Lisp、Java、.net、erLang) 语言本身来负责内存的分配和回收 优点 开发效率高 避免内存分配bug 缺点 不可预期的latency
  • 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。
  • 9. 目标 掌握Sun JDK内存区域是如何划分和使用的 掌握Sun JDK有哪些GC,怎么用,什么时候触发 掌握OOM的解决方法 掌握如何监测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 – Concurrent1 可用-XX:+UseConcMarkSweepGC来强制指定; 优点 在对Old进行回收时,对应用造成的暂停时间非常短,适合对latency要求高的应用; 缺点 内存碎片和浮动垃圾; Old区上的内存分配效率低; 回收的整个耗时比较长; 和应用争抢CPU; 1. jdk 6.0 update 23以前的版本中有一些会导致crash的bug: 6872049,6948538,6948539
  • 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(inti=0;i<7;i++){ caches.add(new byte[1024*1024*3]); } caches.clear(); for(inti=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
  • 27. 目标 掌握Sun JDK内存区域是如何划分和使用的 掌握Sun JDK有哪些GC,怎么用,什么时候触发 掌握OOM的解决方法 掌握如何监测GC的状况
  • 28. Memory Monitoring 内存使用情况 Heap & PermGen jstat –gc or jstat –gcutil jmap–heap C Heap top or ps aux
  • 29. Memory Monitoring 谁用了内存 Heap jmap –histo jmap –dump,then mat C Heap googleperftools
  • 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 –dump1; 再不行就人肉。 Out of Swap 堆开太大了? googleperftools unable to create new native thread 线程太多了? -Xss太大了? PermGen Space permgen太小了? ClassLoader太多了?泄露? 1. jdk 6.0 update 23以前的版本中有这个bug: http://goo.gl/nmTB8
  • 33. 常见问题 Write OOM Friendly Code 限制List/Set/Map/StringBuilder等的大小; 避免死循环;
  • 34. 常见问题 长暂停 应用调优 or GC Tuning 详细请见调优篇。 GC占了应用运行的很多时间 同上 Case Show!
  • 35. 目标 掌握Sun JDK内存区域是如何划分和使用的 掌握Sun JDK有哪些GC,怎么用,什么时候触发 掌握OOM的解决方法 掌握如何监测GC的状况
  • 36. References Sun JDK Memory Management whitepaper 老外正在写的一个OOM系列的文章