JAVA问题定位技术(B培).ppt
《JAVA问题定位技术(B培).ppt》由会员分享,可在线阅读,更多相关《JAVA问题定位技术(B培).ppt(69页珍藏版)》请在三一办公上搜索。
1、JAVA问题定位技术-常用的手段和工具,Page 2,议题,Page 3,线程堆栈 如何输出线程堆栈,Windows:在运行java的控制台上按ctrl+break组合键Unix:保留启动java的控制台,使用kill-3,堆栈的作用:线程死锁分析辅助CPU过高分析线程资源不足分析性能瓶颈分析关键线程异常退出,启动时进行重定向是一个不错的习惯:run.sh start.log 2&1,Page 4,线程堆栈如何解读线程堆栈?,wait()会释放监视锁sleep()与锁操作无关,继续保持监视锁,当一个线程占有一个锁的时候,会打印-locked 当该线程正在等待别的线程释放该锁,就会打印:wait
2、ing to lock 如果代码中有wait()调用的话,首先是locked,然后又会打印-waiting on,Wait也sleep的重大区别,Page 5,http-0.0.0.0-27443-Processor4 daemon prio=5 tid=0 x599a7520 nid=0 x1858 in Object.wait()5c9ef000.5c9efd88at java.lang.Object.wait(Native Method)-waiting on(a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable)at j
3、ava.lang.Object.wait(Object.java:429)at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:655)-locked(a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable)at java.lang.Thread.run(Thread.java:534),线程堆栈如何解读线程堆栈?,表示该线程锁柱了该锁,表示正在线程正停在该对象的wait上面。同时wait会自动释放该锁,Page 6,smp
4、p02:Sender-108 daemon prio=5 tid=0 x59a751a0 nid=0 x13fc waiting for monitor entry 6066f000.6066fd88at org.apache.log4j.Category.callAppenders(Category.java:185)-waiting to lock(a org.apache.log4j.spi.RootCategory)at org.apache.log4j.Category.forcedLog(Category.java:372)at org.apache.log4j.Category.
5、log(Category.java:864)at mons.logging.impl.Log4JLogger.debug(Log4JLogger.java:137)at m.base.server.AbstractHandler.send(AbstractHandler.java:407)at com.huawei.tellin.usr.uc.sendmessage.UCSMPPTransaction.send(UCSMPPTransaction.java:102)at com.huawei.tellin.usr.uc.sendmessage.UCServerProxy.synSend(UCS
6、erverProxy.java:134)at m.base.proxy.SendWorker.run(AbstractProxy.java:666)at com.huawei.uniportal.utilities.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:748)at java.lang.Thread.run(Thread.java:534),waiting to lock 表示该锁已经被别的线程使用,正在等待该锁被释放,线程堆栈如何解读线程堆栈?,Page 7,线程堆栈线程死锁分析,Found one Java-lev
7、el deadlock:=thread1:waiting to lock monitor 0 x009fccb4(object 0 x10032710,a),which is held by thread1thread1:waiting to lock monitor 0 x009fcc94(object 0 x10032718,a),which is held by thread1Java stack information for the threads listed above:=thread1:at DeadLockTest.run(DeadLockTest.java:44)-wait
8、ing to lock(a)-locked(a)at java.lang.Thread.run(Unknown Source)thread1:at DeadLockTest.run(DeadLockTest.java:24)-waiting to lock(a)-locked(a)at java.lang.Thread.run(Unknown Source),虚拟机已经告诉我哪里有死锁了,真不错,0 x10032710 和 0 x10032718 都在等待对方释放,双方都被饿死,Page 8,线程堆栈用户代码导致CPU过高/热点线程分析,首先可以通过kill-3 pid(unix下)或+(wi
9、ndows下)获取一个堆栈信息,几分钟之后再获取一个,通过两个堆栈信息对比,将一直在忙的线程找出来。通过分析对应的代码,确认不正常的线程。第一步:通过kill-3 java_pid 获取当前堆栈信息。第二步:等待一段时间后。再获取一下当前堆栈信息。,Page 9,线程堆栈用户代码导致CPU过高/热点线程分析,第三步:预处理前两个获取的堆栈信息,去掉处于sleeping或waiting的状态的线程。例如如下线程处于wait或者sleep状态,这种线程是不消耗CPU的,因此这些线程可以直接忽略掉,重点关注其它线程:,EventManager-Worker-1 daemon prio=8 tid=0
10、 x00c3ea58 nid=0 x14a in Object.wait()935ff000.935ffc28at java.lang.Object.wait(Native Method)/该线程已挂起,忽略掉-waiting on(a)at java.lang.Object.wait(Object.java:429),第五步:对比预处理后的1,2堆栈信息,找出处于busy状态的线程,该类线程可能是导致cpu高占用率的可疑线程。例如:(下面的是在第一个堆栈信息中找到的处于active 活跃状态的线程)http-80-Processor6 daemon prio=5 tid=0 x013ea77
11、0 nid=0 x143 runnable 92eff000.92f019c0at com.huawei.u_mon.licmgr.LicenseIntf.nativeCheckLicense(Native Method)at com.huawei.u_mon.licmgr.LicenseIntf.checkLicense(LicenseIntf.java:168)at com.huawei.u_sys.meetingone.sysmgr.ejb.LicRelateBean.updateLic(LicRelateBean.java:80),Page 10,线程堆栈用户代码导致CPU过高/热点线
12、程分析,同一个线程在第二个堆栈信息中仍处于活跃状态。http-80-Processor6 daemon prio=5 tid=0 x013ea770 nid=0 x143 runnable 92eff000.92f019c0at com.huawei.u_mon.licmgr.LicenseIntf.nativeCheckLicense(Native Method)at com.huawei.u_mon.licmgr.LicenseIntf.checkLicense(LicenseIntf.java:168)at com.huawei.u_sys.meetingone.sysmgr.ejb.L
13、icRelateBean.updateLic(LicRelateBean.java:80),两次打印堆栈该线程一直在运行,说明该线程已运行了5分钟,请在代码中检查该线程是否属于长时间运行线程?如果属于暂态线程,如此长时间运行说明可能有死循环等导致的CPU过高。,Page 11,线程堆栈线程资源不足分析,aused by:unable to create new native thread;nested exception is:unable to create new native thread at org.jboss.ejb.plugins.AbstractTxInterceptor.in
14、vokeNext(AbstractTxInterceptor.java:214)at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:315)at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:148)at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:111)at org.jboss.ejb
15、.plugins.LogInterceptor.invoke(LogInterceptor.java:191)at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.jav,Caused by:unable to create new native thread at java.lang.Thread.start(Native Method)at.www.http.KeepAliveCache$1.run(KeepAliveCache.java:89)at java.
16、security.AccessController.doPrivileged(Native Method)at.www.http.KeepAliveCache.put(KeepAliveCache.java:75)at.www.http.HttpClient.putInKeepAliveCache(HttpClient.java:382)at.www.http.HttpClient.finished(HttpClient.java:370),线程资源属于数量受限资源,一般一个Java进程中的线程数量不要过多,如果太多虚拟机会拒绝创建。可以通过打印线程堆栈,检查线程的数量,确认问题。如果确实属于
17、线程数量过多,请更改线程模型设计,Page 12,性能瓶颈分析,什么叫高性能?-不同的场合有不同的指标。有的场合高性能意味着用户速度体验,如界面操作。-适合使用OptimizeIt分析还有的场合,高吞吐量意味着高性能,如短信。-适合使用堆栈分析还有的场合是二者的结合,如IP电话-适合使用堆栈分析,Page 13,性能瓶颈分析 Java应用的常见性能陷阱,不良的架构不恰当的线程同步资源的不恰当使用导致的资源竞争不恰当的虚拟机运行参数缓慢的磁盘/网络 IO内存泄漏过分相信Java的自动垃圾回收机制,Page 14,性能瓶颈分析性能设计和调优的原则,80-20原则:20%的代码消耗了80%的资源,2
18、0%的代码执行消耗了80%的时间.当前的性能瓶颈永远只有一处只有解决了当前这一处性能瓶颈,你才知道下一个性能瓶颈在哪里 性能瓶颈是动态的,低负载时不是瓶 颈 的地 方,在高负载时却可能成为瓶颈 性能优化是一个持续的过程 折中的艺术:在性能和灵活性之间寻找平衡点,找出当前性能瓶颈,修改,验证,以稍高于系统的当前能力的压力进行模拟,Page 15,性能瓶颈分析性能分析的手段和方法,JVM手术刀:线程堆栈剖析内存泄漏X光机:内存泄漏分析虚拟机润滑油:JVM参数调优性能调优百宝箱:性能调优工具,Page 16,性能瓶颈分析手段和方法之一线程堆栈剖析,原理:通过分析JVM线程运行情况,定位性能问题方法:
19、kill-3(UNIX)ctrl+break(windows)打印出当前的虚拟机的一个运行剖面,进行分析WorkerThread-8.in Object.wait().-locked(a Queue).WorkerThread-10.in Object.wait().-locked(a Queue).WriterThread-3.in Object.wait().-locked(a Queue).能够发现的性能问题:(1)资源争用(2)锁的粒度过大(3)sleep的滥用适用场合:识别只有在高负载的时候才出现的性能瓶颈。多线程场合不适用的场合:单操作单线程下的代码段耗时分析,如一次界面点击,感觉
20、迟缓。,有一种多线程情况下,需要关注:绝大多数线程处于等待状态,请检查是否有关键路径,没有足够的能力产生线程任务,如:在消息分发系统,消息分发一般是一个线程,而处理是多线程,这时候消息分发是瓶颈的话,观察到的线程堆栈就会出现上面的现象。,Page 17,性能瓶颈分析手段和方法之二 内存泄漏分析,Java 程序也存在内存泄漏内存泄漏表现(1)长时间运行之后系统打印OutOfMemory(2)JVM 莫名其妙地 Core Dump内存泄漏分析通过OptimizeIt,JProfile等可以观察对象的数量和分配的位置JVM 也提供一些工具监控堆的使用情况,尽量使用。内存泄漏避免(1)全局集合 在对象
21、不需要的时侯,从集合中移除(2)缓存 不用的对象及时清理(3)Runnable对象new了就必须使用线程来Run等,Page 18,性能瓶颈分析手段和方法之三 虚拟机调优,原理:观察垃圾回收情况并且进行调整,使JVM的垃圾回收更加平滑和高效率方法:Java 命令行中增加 verbose:gc 运行参数Full GC 792332K-412757K(1040896K),8.9157secsFull GC 799898K-221096K(1040896K),5.3018secs如果每次回收完成后可用的内存持续减少则可能存在内存泄漏。能够发现的性能问题:垃圾回收参数设置不合理导致的严重的性能问题内存
22、泄漏可以调节的JVM 垃圾回收参数IBM JDK:主要参数:-Xconcurrentbackground Xconcurrentlevel,以及堆大小。SUN,HP JDK 主要是-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFractionJVM调优是个系统工程,和运行环境主要是内存配置密切相关,需要酌情配置处理适用场合:高负载但实时性要求不高的系统,如 Web 类应用,如移动彩铃应用,以及大容量且实时性要求非常高的系统,比如呼叫类应用。,Page 19,性能瓶颈分析手段和方法之四 性能调优工具,Optimi
23、zeIt或JProfile 提供全面的内存泄漏分析,函数调用CPU时间和内存占用分析适用场合:(1)单操作单线程下的代码段耗时分析,如一次界面点击,感觉迟缓。不适用的场合:(1)运行期间,同一段代码被不同线程执行时,由于线程是变化的,无法找出对应的线程。(2)大容量应用下出现的瓶颈,因为启动这个工具性能会有几十倍甚至上百倍的的性能下降,难以支撑大容量情况下的测试分析。只有在大容量下出现的锁竞争也许不会出现,频繁的磁盘IO、数据库访问等导致的瓶颈也不会出现。现象不充分暴露,自然也就谈不上分析。,Page 20,性能瓶颈问题产生的源头分析,常见架构和设计问题:同步异步使用不当不合理的负荷分担缺乏必
24、要的缓冲设计并发设计不当资源抢占,连接池和线程池等应用不当等效率低下的通信方式数据库连接缓存使用不当 常见编码问题String+,getByte()的不恰当使用:很多时侯可以使用StringBuf过大的同步范围语句设计不当,Page 21,JAVA 远程调试,虚拟机远程调试开关:-Xdebug-Xrunjdwp:transport=dt_socket,server=y,address=%DEBUG_PORT%,suspend=n,打开调试开关会对JVM的运行速度有影响,仅在需要的时候才这样做,不仅可以调试本机上运行的服务器,还可以调试远程机器,suspend设为n时JVM会在打开调试端口后正常
25、启动,若设为y则JVM启动后会等候调试器连接后才继续启动,Page 22,JAVA 远程调试,在Eclipse中打开调试配置对话框,双击左边树中Remote Java Application增加一项远程调试配置,Project:需要调试的代码所在工程Host:服务器所在机器,可以是打开了调试端口的远程计算机Port:前述打开的调试端口,server的userconfig.bat中的缺省值是3999,Page 23,GC参数/输出解读,下列JVM参数可用于获取gc日志-verbose:gc 或-Xloggc:filename 一些参考资料,Page 24,JAVA 内存泄漏检测,2.1 java
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 问题 定位 技术

链接地址:https://www.31ppt.com/p-5436246.html