SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Downloaden Sie, um offline zu lesen
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: 没有被引用的对象
             » 如忘记释放应该释放的
               引用,就会
               造成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 - Concurrent
• 可用-XX:+UseConcMarkSweepGC来强制指定;
• 优点
 – 在对Old进行回收时,对应用造成的暂停时间非
   常短,适合对latency要求高的应用;
• 缺点
 – 内存碎片和浮动垃圾;
 – Old区上的内存分配效率低;
 – 回收的整个耗时比较长;
 – 和应用争抢CPU;
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(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
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
   • google perftools
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 –dump;
       •   再不行就人肉。
   – Out of Swap
       • 堆开太大了?
       • google perftools
   – unable to create new native thread
       • 线程太多了? -Xss太大了?
   – PermGen Space
       • permgen太小了?
       • ClassLoader太多了?泄露?
常见问题
• 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

Weitere ähnliche Inhalte

Was ist angesagt?

Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Kris Mok
 
Java常见问题排查
Java常见问题排查Java常见问题排查
Java常见问题排查bluedavy lin
 
HBase@taobao for 技术沙龙
HBase@taobao for 技术沙龙HBase@taobao for 技术沙龙
HBase@taobao for 技术沙龙bluedavy lin
 
Sun JDK 1.6内存管理 -调优篇
Sun JDK 1.6内存管理 -调优篇Sun JDK 1.6内存管理 -调优篇
Sun JDK 1.6内存管理 -调优篇bluedavy lin
 
JVM内容管理和垃圾回收
JVM内容管理和垃圾回收JVM内容管理和垃圾回收
JVM内容管理和垃圾回收Tony Deng
 
高性能的Java代码编写及常见问题排查
高性能的Java代码编写及常见问题排查高性能的Java代码编写及常见问题排查
高性能的Java代码编写及常见问题排查bluedavy lin
 
并发编程交流
并发编程交流并发编程交流
并发编程交流bluedavy lin
 
Golang advance
Golang advanceGolang advance
Golang advancerfyiamcool
 
线上问题排查交流
线上问题排查交流线上问题排查交流
线上问题排查交流Edward Lee
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战rfyiamcool
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)wang hongjiang
 
Design realization and application of RBD NBD - Wang Li
Design realization and application of RBD NBD - Wang LiDesign realization and application of RBD NBD - Wang Li
Design realization and application of RBD NBD - Wang LiCeph Community
 
美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术沙龙010-Redis Cluster运维实践美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术沙龙010-Redis Cluster运维实践美团点评技术团队
 
MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB
 
Cephfs架构解读和测试分析
Cephfs架构解读和测试分析Cephfs架构解读和测试分析
Cephfs架构解读和测试分析Yang Guanjun
 
聊聊我接触的集群管理
聊聊我接触的集群管理聊聊我接触的集群管理
聊聊我接触的集群管理rfyiamcool
 
Btrace intro(撒迦)
Btrace intro(撒迦)Btrace intro(撒迦)
Btrace intro(撒迦)ykdsg
 

Was ist angesagt? (20)

Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)
 
Java常见问题排查
Java常见问题排查Java常见问题排查
Java常见问题排查
 
HBase@taobao for 技术沙龙
HBase@taobao for 技术沙龙HBase@taobao for 技术沙龙
HBase@taobao for 技术沙龙
 
Sun JDK 1.6内存管理 -调优篇
Sun JDK 1.6内存管理 -调优篇Sun JDK 1.6内存管理 -调优篇
Sun JDK 1.6内存管理 -调优篇
 
JVM内容管理和垃圾回收
JVM内容管理和垃圾回收JVM内容管理和垃圾回收
JVM内容管理和垃圾回收
 
高性能的Java代码编写及常见问题排查
高性能的Java代码编写及常见问题排查高性能的Java代码编写及常见问题排查
高性能的Java代码编写及常见问题排查
 
并发编程交流
并发编程交流并发编程交流
并发编程交流
 
Golang advance
Golang advanceGolang advance
Golang advance
 
线上问题排查交流
线上问题排查交流线上问题排查交流
线上问题排查交流
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)
 
Sun jdk 1.6 gc
Sun jdk 1.6 gcSun jdk 1.6 gc
Sun jdk 1.6 gc
 
Design realization and application of RBD NBD - Wang Li
Design realization and application of RBD NBD - Wang LiDesign realization and application of RBD NBD - Wang Li
Design realization and application of RBD NBD - Wang Li
 
美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术沙龙010-Redis Cluster运维实践美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术沙龙010-Redis Cluster运维实践
 
Jvm内存管理基础
Jvm内存管理基础Jvm内存管理基础
Jvm内存管理基础
 
MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB at Qihoo 360
MongoDB at Qihoo 360
 
Cephfs架构解读和测试分析
Cephfs架构解读和测试分析Cephfs架构解读和测试分析
Cephfs架构解读和测试分析
 
聊聊我接触的集群管理
聊聊我接触的集群管理聊聊我接触的集群管理
聊聊我接触的集群管理
 
Ceph perf-tunning
Ceph perf-tunningCeph perf-tunning
Ceph perf-tunning
 
Btrace intro(撒迦)
Btrace intro(撒迦)Btrace intro(撒迦)
Btrace intro(撒迦)
 

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

Sun jdk 1.6内存管理 -调优篇-毕玄
Sun jdk 1.6内存管理 -调优篇-毕玄Sun jdk 1.6内存管理 -调优篇-毕玄
Sun jdk 1.6内存管理 -调优篇-毕玄锐 张
 
Mongodb Blockstore memory and system tuning
Mongodb Blockstore memory and system tuningMongodb Blockstore memory and system tuning
Mongodb Blockstore memory and system tuningYI-CHING WU
 
Jvm状态监控与oom案例分析
Jvm状态监控与oom案例分析Jvm状态监控与oom案例分析
Jvm状态监控与oom案例分析beiyu95
 
Jmm与map reduce简介
Jmm与map reduce简介Jmm与map reduce简介
Jmm与map reduce简介huozhanfeng
 
Java常见问题排查
Java常见问题排查Java常见问题排查
Java常见问题排查ayanamist
 
淘宝前台系统性能分析与优化
淘宝前台系统性能分析与优化淘宝前台系统性能分析与优化
淘宝前台系统性能分析与优化丁 宇
 
Java垃圾收集原理
Java垃圾收集原理Java垃圾收集原理
Java垃圾收集原理yin gong
 
Java垃圾收集原理
Java垃圾收集原理Java垃圾收集原理
Java垃圾收集原理yin gong
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈Tim Y
 
分布式Key-value漫谈
分布式Key-value漫谈分布式Key-value漫谈
分布式Key-value漫谈lovingprince58
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出wang hongjiang
 
Chasingice
ChasingiceChasingice
Chasingice冰 白
 
Jvm那些事
Jvm那些事Jvm那些事
Jvm那些事dynamiclu
 
淘宝网前台应用性能优化实践
淘宝网前台应用性能优化实践淘宝网前台应用性能优化实践
淘宝网前台应用性能优化实践丁 宇
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)Kris Mok
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
Java trouble shooting
Java trouble shootingJava trouble shooting
Java trouble shootingMin Zhou
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
Sun jdk-1.6-gc
Sun jdk-1.6-gcSun jdk-1.6-gc
Sun jdk-1.6-gc锐 张
 

Ähnlich wie Sun jdk 1.6内存管理 -使用篇-毕玄 (20)

Sun jdk 1.6内存管理 -调优篇-毕玄
Sun jdk 1.6内存管理 -调优篇-毕玄Sun jdk 1.6内存管理 -调优篇-毕玄
Sun jdk 1.6内存管理 -调优篇-毕玄
 
Mongodb Blockstore memory and system tuning
Mongodb Blockstore memory and system tuningMongodb Blockstore memory and system tuning
Mongodb Blockstore memory and system tuning
 
Jvm状态监控与oom案例分析
Jvm状态监控与oom案例分析Jvm状态监控与oom案例分析
Jvm状态监控与oom案例分析
 
Jmm与map reduce简介
Jmm与map reduce简介Jmm与map reduce简介
Jmm与map reduce简介
 
Java常见问题排查
Java常见问题排查Java常见问题排查
Java常见问题排查
 
淘宝前台系统性能分析与优化
淘宝前台系统性能分析与优化淘宝前台系统性能分析与优化
淘宝前台系统性能分析与优化
 
Java垃圾收集原理
Java垃圾收集原理Java垃圾收集原理
Java垃圾收集原理
 
Java垃圾收集原理
Java垃圾收集原理Java垃圾收集原理
Java垃圾收集原理
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈
 
分布式Key-value漫谈
分布式Key-value漫谈分布式Key-value漫谈
分布式Key-value漫谈
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出
 
Java内存管理
Java内存管理Java内存管理
Java内存管理
 
Chasingice
ChasingiceChasingice
Chasingice
 
Jvm那些事
Jvm那些事Jvm那些事
Jvm那些事
 
淘宝网前台应用性能优化实践
淘宝网前台应用性能优化实践淘宝网前台应用性能优化实践
淘宝网前台应用性能优化实践
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
Java trouble shooting
Java trouble shootingJava trouble shooting
Java trouble shooting
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
Sun jdk-1.6-gc
Sun jdk-1.6-gcSun jdk-1.6-gc
Sun jdk-1.6-gc
 

Mehr von 锐 张

长尾理论(The longtail)版
长尾理论(The longtail)版长尾理论(The longtail)版
长尾理论(The longtail)版锐 张
 
Openstack starter-guide-diablo
Openstack starter-guide-diabloOpenstack starter-guide-diablo
Openstack starter-guide-diablo锐 张
 
基于My sql的分布式数据库实践
基于My sql的分布式数据库实践基于My sql的分布式数据库实践
基于My sql的分布式数据库实践锐 张
 
Redis中文入门手册
Redis中文入门手册Redis中文入门手册
Redis中文入门手册锐 张
 
Redis学习笔记
Redis学习笔记Redis学习笔记
Redis学习笔记锐 张
 
Redis内存存储结构分析
Redis内存存储结构分析Redis内存存储结构分析
Redis内存存储结构分析锐 张
 
淘宝前端优化
淘宝前端优化淘宝前端优化
淘宝前端优化锐 张
 
Sun jdk 1.6内存管理 -实现篇 -毕玄
Sun jdk 1.6内存管理 -实现篇 -毕玄Sun jdk 1.6内存管理 -实现篇 -毕玄
Sun jdk 1.6内存管理 -实现篇 -毕玄锐 张
 
Redis介绍
Redis介绍Redis介绍
Redis介绍锐 张
 
Redis深入浅出
Redis深入浅出Redis深入浅出
Redis深入浅出锐 张
 
Green plum培训材料
Green plum培训材料Green plum培训材料
Green plum培训材料锐 张
 
Greenplum技术
Greenplum技术Greenplum技术
Greenplum技术锐 张
 
新时代的分析型云数据库 Greenplum
新时代的分析型云数据库 Greenplum新时代的分析型云数据库 Greenplum
新时代的分析型云数据库 Greenplum锐 张
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt锐 张
 
新浪云计算公开课第二期:Sae平台的灵活应用(吕毅、魏世江)
新浪云计算公开课第二期:Sae平台的灵活应用(吕毅、魏世江)新浪云计算公开课第二期:Sae平台的灵活应用(吕毅、魏世江)
新浪云计算公开课第二期:Sae平台的灵活应用(吕毅、魏世江)锐 张
 
新浪云计算公开课第一期:Let’s run @ sae(丛磊)
新浪云计算公开课第一期:Let’s run @ sae(丛磊)新浪云计算公开课第一期:Let’s run @ sae(丛磊)
新浪云计算公开课第一期:Let’s run @ sae(丛磊)锐 张
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计锐 张
 
亚马逊云计算Aws
亚马逊云计算Aws亚马逊云计算Aws
亚马逊云计算Aws锐 张
 
20110625.【打造高效能的cdn系统】.易统
20110625.【打造高效能的cdn系统】.易统20110625.【打造高效能的cdn系统】.易统
20110625.【打造高效能的cdn系统】.易统锐 张
 
网易海量数据存储平台的构建和运维
网易海量数据存储平台的构建和运维网易海量数据存储平台的构建和运维
网易海量数据存储平台的构建和运维锐 张
 

Mehr von 锐 张 (20)

长尾理论(The longtail)版
长尾理论(The longtail)版长尾理论(The longtail)版
长尾理论(The longtail)版
 
Openstack starter-guide-diablo
Openstack starter-guide-diabloOpenstack starter-guide-diablo
Openstack starter-guide-diablo
 
基于My sql的分布式数据库实践
基于My sql的分布式数据库实践基于My sql的分布式数据库实践
基于My sql的分布式数据库实践
 
Redis中文入门手册
Redis中文入门手册Redis中文入门手册
Redis中文入门手册
 
Redis学习笔记
Redis学习笔记Redis学习笔记
Redis学习笔记
 
Redis内存存储结构分析
Redis内存存储结构分析Redis内存存储结构分析
Redis内存存储结构分析
 
淘宝前端优化
淘宝前端优化淘宝前端优化
淘宝前端优化
 
Sun jdk 1.6内存管理 -实现篇 -毕玄
Sun jdk 1.6内存管理 -实现篇 -毕玄Sun jdk 1.6内存管理 -实现篇 -毕玄
Sun jdk 1.6内存管理 -实现篇 -毕玄
 
Redis介绍
Redis介绍Redis介绍
Redis介绍
 
Redis深入浅出
Redis深入浅出Redis深入浅出
Redis深入浅出
 
Green plum培训材料
Green plum培训材料Green plum培训材料
Green plum培训材料
 
Greenplum技术
Greenplum技术Greenplum技术
Greenplum技术
 
新时代的分析型云数据库 Greenplum
新时代的分析型云数据库 Greenplum新时代的分析型云数据库 Greenplum
新时代的分析型云数据库 Greenplum
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt
 
新浪云计算公开课第二期:Sae平台的灵活应用(吕毅、魏世江)
新浪云计算公开课第二期:Sae平台的灵活应用(吕毅、魏世江)新浪云计算公开课第二期:Sae平台的灵活应用(吕毅、魏世江)
新浪云计算公开课第二期:Sae平台的灵活应用(吕毅、魏世江)
 
新浪云计算公开课第一期:Let’s run @ sae(丛磊)
新浪云计算公开课第一期:Let’s run @ sae(丛磊)新浪云计算公开课第一期:Let’s run @ sae(丛磊)
新浪云计算公开课第一期:Let’s run @ sae(丛磊)
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计
 
亚马逊云计算Aws
亚马逊云计算Aws亚马逊云计算Aws
亚马逊云计算Aws
 
20110625.【打造高效能的cdn系统】.易统
20110625.【打造高效能的cdn系统】.易统20110625.【打造高效能的cdn系统】.易统
20110625.【打造高效能的cdn系统】.易统
 
网易海量数据存储平台的构建和运维
网易海量数据存储平台的构建和运维网易海量数据存储平台的构建和运维
网易海量数据存储平台的构建和运维
 

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

  • 1. Sun JDK 1.6内存管理 使用篇 毕玄 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 - 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
  • 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 • google perftools
  • 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太多了?泄露?
  • 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系列的文章 • 两个OOM Cases排查过程的分享 • 一个GC频繁的Case