SlideShare a Scribd company logo
Java             shooting
       新人培训课程 | 从入门到精通




                         作者:周忱 | CDO数据交换平台
                         微博:@MinZhou
                         邮箱:zhouchen.zm@taobao.com
Java Troubleshooting




                   为什么我的应用这么慢?




                             Taobao Java Team | zhouchen.zm
Java Troubleshooting




                       为什么出现OOM?




                                   Taobao Java Team | zhouchen.zm
Java Troubleshooting




              为什么我的程序半天不动了?




                         Taobao Java Team | zhouchen.zm
Java Troubleshooting




                        屌丝的工具集
           •   jps          •   vmstat
           •   jinfo        •   iostat
           •   jstat        •   sar
           •   jstack       •   ps
           •   jmap         •   top
           •   jhat         •   free
                            •   pstack
                            •   pmap


                                         Taobao Java Team | zhouchen.zm
Java Troubleshooting




               示例-分析挂起的Java应用1




                            Taobao Java Team | zhouchen.zm
Java Troubleshooting




               示例-分析挂起的Java应用2




                            Taobao Java Team | zhouchen.zm
Java Troubleshooting




                  示例-分析跑得慢的应用




                            Taobao Java Team | zhouchen.zm
Java Troubleshooting




                       高富帅的工具集
           • jvisualvm        •   Perf
           • IBM memory       •   systemtap
             Analysis tools   •   Oprofile
           • Btrace           •   Google perf-tools
           • TProfiler        •   Intel Vtune
           • HouseMD          •   blktrace
           • …                •   …




                                          Taobao Java Team | zhouchen.zm
Java Troubleshooting




          示例-jvisualvm分析跑得慢的应用




                          Taobao Java Team | zhouchen.zm
Java Troubleshooting




                       基本概念—内存结构
                          -Xss

                        局部变量区        本地方法栈
                PC寄      操作数栈                          -XX:PermSize –

                存器        栈帧
                                      JVM方法区          XX:MaxPermSize



                       JVM方法栈          JVM堆          -Xms -Xmx




               备注:在Hotspot中本地方法栈和JVM方法栈是同一个,因此也可用-Xss控制




                                                     Taobao Java Team | zhouchen.zm
Java Troubleshooting




                       基本概念—内存分配
   1、堆上分配
     大多数情况在eden上分配,偶尔会直接在old上分配
     细节取决于GC的实现
     这里最重要的优化是TLAB

   2、栈上分配
     原子类型的局部变量
     或基于EA后标量替换转变为原子类型的局部变量

   3、堆外分配
     DirectByteBuffer
     FileChannel.map
     或直接使用Unsafe.allocateMemory,但不推荐这种方式
                                   Taobao Java Team | zhouchen.zm
Java Troubleshooting




   基本概念—内存回收(Garbage Collection)
   1、Hotspot认为没有引用的对象是dead的

   2、Hotspot将引用分为四种
     Strong、Soft、Weak、Phantom
     Strong即默认通过Object o=new Object()这种方式赋值的引用;
     Soft、Weak、Phantom这三种则都是继承Reference;
     在Full GC时会对Reference类型的引用进行特殊处理:
      Soft:内存不够时一定会被GC、长期不用也会被GC,可通过
     -XX:SoftRefLRUPolicyMSPerMB来设置;
      Weak:一定会被GC,当被mark为dead,会在
     ReferenceQueue中通知;
      Phantom:本来就没引用,当从jvm heap中释放,会通知

                                    Taobao Java Team | zhouchen.zm
Java Troubleshooting




                       基本概念—分代


     经IBM研究,通常运行的程序有98%的对象是临时对象,
      因此Sun Hotspot对JVM堆采用了分代的方式来管理,以
      提升GC的效率。




                                 Taobao Java Team | zhouchen.zm
Java Troubleshooting




                  基本概念—JVM堆的分代
          -Xmn     New Generation

              Eden                 S0      S1   Old Generation
                       -XX:SurvivorRatio




         备注:通常将对新生代进行的回收称为Minor GC;对旧生代进行的回收称为Major GC,但由于
         Major GC除并发GC外均需对整个堆进行扫描和回收,因此又称为Full GC。




                                                       Taobao Java Team | zhouchen.zm
Java Troubleshooting




               基本概念—GC算法及其组合




                          Taobao Java Team | zhouchen.zm
Java Troubleshooting




                         开启 GC Log
       -verbose:gc // 可以辅助输出一些详细的GC信息
       -XX:+PrintGCDetails // 输出GC详细信息
       -XX:+PrintGCApplicationStoppedTime // 输出GC造成应用暂停的时间
       -XX:+PrintGCDateStamps // GC发生的时间信息
       -XX:+PrintHeapAtGC // 在GC前后输出堆中各个区域的大小
       -Xloggc:[file] // 将GC信息输出到单独的文件中

       gc的日志拿下来后可使用GCLogViewer或gchisto进行分析。




                                                  Taobao Java Team | zhouchen.zm
Java Troubleshooting




                           ParNew GC Log
    39.910: [GC 39.910: [ParNew: 261760K->0K(261952K), 0.2314667 secs] 262017K-
       >26386K(1048384K), 0.2318679 secs]




                                                              Taobao Java Team | zhouchen.zm
Java Troubleshooting




                               CMS GC Log
   40.146: [GC [1 CMS-initial-mark: 26386K(786432K)] 26404K(1048384K),
      0.0074495 secs]
   40.154: [CMS-concurrent-mark-start]
   40.683: [CMS-concurrent-mark: 0.521/0.529 secs]
   40.683: [CMS-concurrent-preclean-start]
   40.701: [CMS-concurrent-preclean: 0.017/0.018 secs]
   40.704: [GC40.704: [Rescan (parallel) , 0.1790103 secs]40.883: [weak refs
      processing, 0.0100966 secs] [1 CMS-remark: 26386K(786432K)]
      52644K(1048384K), 0.1897792 secs]
   40.894: [CMS-concurrent-sweep-start]
   41.020: [CMS-concurrent-sweep: 0.126/0.126 secs]
   41.020: [CMS-concurrent-reset-start]
   41.147: [CMS-concurrent-reset: 0.127/0.127 secs]               CMS GC 详解

                                                                 Taobao Java Team | zhouchen.zm
Java Troubleshooting




               示例-分析gc overhead OOM




                                Taobao Java Team | zhouchen.zm
Java Troubleshooting




                  示例-分析Permgen OOM




                                Taobao Java Team | zhouchen.zm
Java Troubleshooting




                  示例-分析堆外内存占用




                            Taobao Java Team | zhouchen.zm
Java Troubleshooting




               示例-分析挂起的Java应用3




                            Taobao Java Team | zhouchen.zm
Java Troubleshooting




                       Q&A




                             作者:周忱 | CDO数据交换平台
                             微博:@MinZhou
                             邮箱:zhouchen.zm@taobao.com



                                     Taobao Java Team | zhouchen.zm

More Related Content

PDF
Java Concurrent Optimization: Concurrent Queue
PPT
JVM内容管理和垃圾回收
PDF
Java cpu
PDF
Btrace intro(撒迦)
PDF
JVM及其调优
PPTX
Jvm基础调优实践(v1.0)
PPTX
为啥别读HotSpot VM的源码(2012-03-03)
Java Concurrent Optimization: Concurrent Queue
JVM内容管理和垃圾回收
Java cpu
Btrace intro(撒迦)
JVM及其调优
Jvm基础调优实践(v1.0)
为啥别读HotSpot VM的源码(2012-03-03)

What's hot (19)

PDF
Java线上应用问题排查方法和工具(空望)
PPTX
并发编程交流
PPTX
Java Crash分析(2012-05-10)
PPTX
线上问题排查交流
PPTX
Sun jdk 1.6内存管理 -使用篇
PPTX
Java常见问题排查
PPTX
Java内存管理问题案例分享
PDF
合久必分,分久必合
PPT
系统性能分析和优化.ppt
PPTX
From Java Stream to Java DataFrame
PPTX
Sun JDK 1.6内存管理 -调优篇
PPTX
給初學者的Spark教學
PPTX
高性能的Java代码编写及常见问题排查
KEY
D2_Node在淘宝的应用实践
PPTX
UseNUMA做了什么?(2012-03-14)
PDF
Java GC Tuning
PPT
Jvm内存管理基础
PPTX
Ali-tomcat
PPT
Node.js在淘宝的应用实践
Java线上应用问题排查方法和工具(空望)
并发编程交流
Java Crash分析(2012-05-10)
线上问题排查交流
Sun jdk 1.6内存管理 -使用篇
Java常见问题排查
Java内存管理问题案例分享
合久必分,分久必合
系统性能分析和优化.ppt
From Java Stream to Java DataFrame
Sun JDK 1.6内存管理 -调优篇
給初學者的Spark教學
高性能的Java代码编写及常见问题排查
D2_Node在淘宝的应用实践
UseNUMA做了什么?(2012-03-14)
Java GC Tuning
Jvm内存管理基础
Ali-tomcat
Node.js在淘宝的应用实践
Ad

Similar to Java trouble shooting (13)

PDF
Java程序员也需要了解CPU
PPTX
Jvm memory
PPT
Jvm那些事
PPTX
Java常见问题排查
PDF
实战HotSpot JVM GC
PDF
Sun jdk 1.6内存管理 -使用篇-毕玄
PDF
Java应用性能测试与分析
PPT
Effective linux.3.(diagnosis)
PDF
移动开发的性能优化
PPT
Java垃圾收集原理
PPT
Java垃圾收集原理
PDF
Android开发基础
PDF
Sun jdk 1.6内存管理 -调优篇-毕玄
Java程序员也需要了解CPU
Jvm memory
Jvm那些事
Java常见问题排查
实战HotSpot JVM GC
Sun jdk 1.6内存管理 -使用篇-毕玄
Java应用性能测试与分析
Effective linux.3.(diagnosis)
移动开发的性能优化
Java垃圾收集原理
Java垃圾收集原理
Android开发基础
Sun jdk 1.6内存管理 -调优篇-毕玄
Ad

More from Min Zhou (7)

PDF
Distributed Data Analytics at Taobao
PPTX
Big Data Analytics Infrastructure
PDF
准实时海量数据分析系统架构探究
PDF
Hive
PPTX
淘宝Hadoop数据分析实践
PPT
Anthill: A Distributed DBMS Based On MapReduce
PPT
Redpoll
Distributed Data Analytics at Taobao
Big Data Analytics Infrastructure
准实时海量数据分析系统架构探究
Hive
淘宝Hadoop数据分析实践
Anthill: A Distributed DBMS Based On MapReduce
Redpoll

Java trouble shooting

  • 1. Java shooting 新人培训课程 | 从入门到精通 作者:周忱 | CDO数据交换平台 微博:@MinZhou 邮箱:zhouchen.zm@taobao.com
  • 2. Java Troubleshooting 为什么我的应用这么慢? Taobao Java Team | zhouchen.zm
  • 3. Java Troubleshooting 为什么出现OOM? Taobao Java Team | zhouchen.zm
  • 4. Java Troubleshooting 为什么我的程序半天不动了? Taobao Java Team | zhouchen.zm
  • 5. Java Troubleshooting 屌丝的工具集 • jps • vmstat • jinfo • iostat • jstat • sar • jstack • ps • jmap • top • jhat • free • pstack • pmap Taobao Java Team | zhouchen.zm
  • 6. Java Troubleshooting 示例-分析挂起的Java应用1 Taobao Java Team | zhouchen.zm
  • 7. Java Troubleshooting 示例-分析挂起的Java应用2 Taobao Java Team | zhouchen.zm
  • 8. Java Troubleshooting 示例-分析跑得慢的应用 Taobao Java Team | zhouchen.zm
  • 9. Java Troubleshooting 高富帅的工具集 • jvisualvm • Perf • IBM memory • systemtap Analysis tools • Oprofile • Btrace • Google perf-tools • TProfiler • Intel Vtune • HouseMD • blktrace • … • … Taobao Java Team | zhouchen.zm
  • 10. Java Troubleshooting 示例-jvisualvm分析跑得慢的应用 Taobao Java Team | zhouchen.zm
  • 11. Java Troubleshooting 基本概念—内存结构 -Xss 局部变量区 本地方法栈 PC寄 操作数栈 -XX:PermSize – 存器 栈帧 JVM方法区 XX:MaxPermSize JVM方法栈 JVM堆 -Xms -Xmx 备注:在Hotspot中本地方法栈和JVM方法栈是同一个,因此也可用-Xss控制 Taobao Java Team | zhouchen.zm
  • 12. Java Troubleshooting 基本概念—内存分配 1、堆上分配 大多数情况在eden上分配,偶尔会直接在old上分配 细节取决于GC的实现 这里最重要的优化是TLAB 2、栈上分配 原子类型的局部变量 或基于EA后标量替换转变为原子类型的局部变量 3、堆外分配 DirectByteBuffer FileChannel.map 或直接使用Unsafe.allocateMemory,但不推荐这种方式 Taobao Java Team | zhouchen.zm
  • 13. Java Troubleshooting 基本概念—内存回收(Garbage Collection) 1、Hotspot认为没有引用的对象是dead的 2、Hotspot将引用分为四种 Strong、Soft、Weak、Phantom Strong即默认通过Object o=new Object()这种方式赋值的引用; Soft、Weak、Phantom这三种则都是继承Reference; 在Full GC时会对Reference类型的引用进行特殊处理: Soft:内存不够时一定会被GC、长期不用也会被GC,可通过 -XX:SoftRefLRUPolicyMSPerMB来设置; Weak:一定会被GC,当被mark为dead,会在 ReferenceQueue中通知; Phantom:本来就没引用,当从jvm heap中释放,会通知 Taobao Java Team | zhouchen.zm
  • 14. Java Troubleshooting 基本概念—分代 经IBM研究,通常运行的程序有98%的对象是临时对象, 因此Sun Hotspot对JVM堆采用了分代的方式来管理,以 提升GC的效率。 Taobao Java Team | zhouchen.zm
  • 15. Java Troubleshooting 基本概念—JVM堆的分代 -Xmn New Generation Eden S0 S1 Old Generation -XX:SurvivorRatio 备注:通常将对新生代进行的回收称为Minor GC;对旧生代进行的回收称为Major GC,但由于 Major GC除并发GC外均需对整个堆进行扫描和回收,因此又称为Full GC。 Taobao Java Team | zhouchen.zm
  • 16. Java Troubleshooting 基本概念—GC算法及其组合 Taobao Java Team | zhouchen.zm
  • 17. Java Troubleshooting 开启 GC Log -verbose:gc // 可以辅助输出一些详细的GC信息 -XX:+PrintGCDetails // 输出GC详细信息 -XX:+PrintGCApplicationStoppedTime // 输出GC造成应用暂停的时间 -XX:+PrintGCDateStamps // GC发生的时间信息 -XX:+PrintHeapAtGC // 在GC前后输出堆中各个区域的大小 -Xloggc:[file] // 将GC信息输出到单独的文件中 gc的日志拿下来后可使用GCLogViewer或gchisto进行分析。 Taobao Java Team | zhouchen.zm
  • 18. Java Troubleshooting ParNew GC Log 39.910: [GC 39.910: [ParNew: 261760K->0K(261952K), 0.2314667 secs] 262017K- >26386K(1048384K), 0.2318679 secs] Taobao Java Team | zhouchen.zm
  • 19. Java Troubleshooting CMS GC Log 40.146: [GC [1 CMS-initial-mark: 26386K(786432K)] 26404K(1048384K), 0.0074495 secs] 40.154: [CMS-concurrent-mark-start] 40.683: [CMS-concurrent-mark: 0.521/0.529 secs] 40.683: [CMS-concurrent-preclean-start] 40.701: [CMS-concurrent-preclean: 0.017/0.018 secs] 40.704: [GC40.704: [Rescan (parallel) , 0.1790103 secs]40.883: [weak refs processing, 0.0100966 secs] [1 CMS-remark: 26386K(786432K)] 52644K(1048384K), 0.1897792 secs] 40.894: [CMS-concurrent-sweep-start] 41.020: [CMS-concurrent-sweep: 0.126/0.126 secs] 41.020: [CMS-concurrent-reset-start] 41.147: [CMS-concurrent-reset: 0.127/0.127 secs] CMS GC 详解 Taobao Java Team | zhouchen.zm
  • 20. Java Troubleshooting 示例-分析gc overhead OOM Taobao Java Team | zhouchen.zm
  • 21. Java Troubleshooting 示例-分析Permgen OOM Taobao Java Team | zhouchen.zm
  • 22. Java Troubleshooting 示例-分析堆外内存占用 Taobao Java Team | zhouchen.zm
  • 23. Java Troubleshooting 示例-分析挂起的Java应用3 Taobao Java Team | zhouchen.zm
  • 24. Java Troubleshooting Q&A 作者:周忱 | CDO数据交换平台 微博:@MinZhou 邮箱:zhouchen.zm@taobao.com Taobao Java Team | zhouchen.zm