`
m635674608
  • 浏览: 5027464 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

常用性能调试手段

 
阅读更多

在开发过程中经常会出现这样那样的性能问题,让人很纠结,下面我会列举一些常用的性能调试手段来找出对应的性能问题的原因

一、CPU过高
这是最常发生的让人很纠结的问题,CPU 100%了 ,但到底是什么引发的呢?
使用Jprofiler之类的工具可以查看CPU问题,能列出CPU具体堆栈,但是有个问题是Jprofiler本身会占用很高的CPU,用Jprofiler来查看CPU问题的时候会很不靠谱。
下面介绍一些比较简单的查看CPU高的方法。
首先来看哪些线程占用了最多的CPU
(1)ps  -eLo pid,lwp,pcpu | grep  <pid>|sort -nk 3
   该方法可以找到CPU占用前3的线程
 (2) top -H 
   该方法能列出占用最高的那些线程
通过上述方法可以知道有问题的线程的pid,然后将该线程号由10进制改为16进制。
接下来来看线程的堆栈
jstack -l <pid>
该方法打出进程的所有线程堆栈,查找16进制的线程号,nid=0x17a1  这个就是线程号的位置
比如
"FelixStartLevel-SendThread(db-3.photo.163.org:2181)" daemon prio=10 tid=0x00007fba6406a800 nid=0x17a1 runnable [bidw:0x000000004027c000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
        at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:228)
        at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:83)
        at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
        - locked <0x00007fba7d9c2d80> (a sun.nio.ch.Util$1)
        - locked <0x00007fba7d9c31c0> (a java.util.Collections$UnmodifiableSet)
        - locked <0x00007fba7d9c2dd8> (a sun.nio.ch.EPollSelectorImpl)
        at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98)
        at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1107)
   Locked ownable synchronizers:
        - None
这个jstack只是一个采样的方法,看当前线程执行的位置。
但我们可以假设在CPU100%的情况下,你基本上采样都是在出问题的语句上。因此这个堆栈的第一行
 at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
就是CPU出问题的地方。可以多用jstack采样几次 ,看看是否都在同一个地方。
这个方法很简单,屡试不爽,也不需要安装软件,方便使用。

二、内存OOM

内存OOM是大家常见的问题,线上遇到OOM不要慌,别先记着重启,第一步先把内存堆栈打印出来
jmap -dump:live,format=b,file=<filename>

如果线上经常经常出现OOM问题也可以在JVM参数里加上-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<filePath>  在进程OOM时自动dump出内存堆栈

有了内存堆栈就好办了,给大家介绍个工具MAT,是我觉得最好用的内存分析工具http://www.eclipse.org/mat/
      leak suspects帮助你分析内存泄露可能的地方,像我上面的例子就看出ShutDownHook有问题,溢出了
    但是溢出的对象从哪里来,可以在details中点击list objects-> Incoming references

 就能够看到引用对象的引用来源,这样就一目了然了哪里有泄露
三、句柄泄露

这是大部分java开发者不太会关心的一个问题,写过C程序的开发者会比较容易重视这个问题。正因为不重视所以还是很容易出现的。
大部分的监控平台都有CPU、内存、硬盘的监控,但很多没有句柄的监控。最后程序发生too many open files了,却不知道。

句柄泄露的查看方式很简单,可以用lsof -p <pid>,查看进程所占用的所有句柄,当句柄泄露的时候肯定会有部分句柄出现极为异常的数量。
lsof -p 6022 
java    6022   fs    1w   REG                8,8     5006   3014678 /home/xxx/log.log
java    6022   fs    2w   REG                8,8     5006   3014678 /home/xxx/log.log
需要仔细检查句柄占用过多的文件代码是否有问题。

我之前就发生过一次句柄泄露。也是代码写的有问题(第三方软件内部源码没研究透),不断重复开FileInputStream而没有复用,导致句柄泄露。哎。。。没监控,搞得很大个事
性能问题大家都容易碰到,分享一些个人的心得,帮助大家定位性能问题。大家有更好的方法也告诉我。

http://my.oschina.net/91jason/blog/485617

分享到:
评论

相关推荐

    VxWorks常用调试手段

    本文将详细介绍VxWorks中常用的调试手段,包括VxWorks命令、内存操作、异常处理、DMMS(动态内存管理服务)等方面。 1. VxWorks命令: - 内存读写:`d/m`命令用于查看或修改内存中的数据,支持读取和写入8位、16位...

    VxWorks 常用调试手段.ppt

    总的来说,VxWorks提供了丰富的调试手段,包括但不限于内存操作、任务堆栈分析、异常处理、资源管理等,这些工具对于理解和调试复杂的嵌入式系统至关重要。通过熟练掌握这些调试技巧,开发者可以更有效地定位和解决...

    FPGA常用调试技术

    ### FPGA常用调试技术详解 #### 一、查看综合报告 在FPGA开发中,综合报告是定位设计问题的重要工具。综合工具(如Xilinx的XST)在分析代码时,会针对潜在的问题发出警告,帮助设计者识别并解决错误。虽然部分警告...

    asp 调试工具

    ASP(Active Server Pages)是一种由微软开发的服务器端脚本环境,用于生成动态网页或Web应用程序。在开发ASP应用过程中,调试是至关重要的步骤,它帮助...在实际工作中,结合多种调试手段,往往能更好地解决问题。

    javajava调试java调试java调试java调试

    8. **日志与打印调试**:在无法使用IDE或者远程服务器的情况下,日志和打印语句是常用的调试手段。通过在关键位置添加打印语句,输出变量信息,可以帮助理解程序运行过程。 9. **单元测试与集成测试**:编写测试...

    MTK调试(MTK的调试过程解析)

    在MTK平台上,常用的手机调试手段之一是TRACE函数。例如,`kal_prompt_trace`函数是系统提供的,主要用于在catcher中调试错误。当`kal_prompt_trace`不适用时,可以使用`system_print`或`dbg_printf`函数,它们可以...

    Linux常用性能诊断工具

    ### Linux常用性能诊断工具知识点详解 #### 一、性能概述与标准 - **性能基准**:性能基准是指衡量一个高性能系统的参考数据。它为评估系统的实际表现提供了标准。 - **设计阶段解决性能问题**:在设计阶段就考虑...

    常用性能分析和网络分析工具

    在IT领域,性能分析和网络分析工具是诊断和优化系统运行状态的重要手段。这些工具能够帮助我们理解系统资源的使用情况,找出瓶颈,以及解决网络问题。本文将深入探讨一些常用的性能分析和网络分析工具,并重点介绍...

    php代码调试工具

    其次,PHP的错误报告机制是基础的调试手段。通过设置`error_reporting`和`display_errors`配置,可以在运行时获取错误信息。不过,在生产环境中,通常会关闭错误显示,而是将错误日志记录到文件中。 此外,var_dump...

    ubuntu上android真机调试脚本文件和wifi调试apk

    Android真机调试是开发者常用的一种测试手段,它允许开发者在实际设备上运行和测试应用程序,以获取更准确的性能表现和用户体验反馈。Ubuntu作为一款开源、跨平台的操作系统,受到许多开发者特别是Android开发者的...

    阿布反调试工具插件下载

    在IT安全领域,调试工具是开发者和逆向工程师常用的软件,用于分析程序的运行过程、查找漏洞或理解代码逻辑。然而,随着网络安全的提升,一些软件开发者开始采用反调试技术来保护自己的产品免受非法篡改和分析。...

    php调试程序技术

    对于性能调试,开发者经常使用`microtime()`来测量代码段的执行时间。然而,为了更精确地分析性能瓶颈,`Xdebug`和`APD(Advanced PHP Debugger)`提供了更强大的功能。`Xdebug`可以生成代码覆盖报告和性能分析,而`...

    软件调试 张英奎编著

    此外,书中还可能探讨调试与性能优化的关系,解释如何通过调试工具分析性能瓶颈,进行代码优化。 总的来说,《软件调试》是一本面向实践的书籍,旨在提升开发者在面对复杂软件问题时的诊断和解决能力。通过学习,...

    webservice调试工具

    总结,Web服务调试工具是Web服务开发不可或缺的辅助手段,通过合理利用这些工具,开发者可以更高效地测试和优化Web服务,确保其稳定、可靠和高性能。选择合适的工具,并熟练掌握其使用,对于提升开发效率和保证服务...

    数据库开发教程 软件调试

    7. **代码审查**:探讨代码审查作为预防性调试手段的价值,以及如何进行有效的代码审查。 通过这两个教程的学习,你将能够熟练地进行数据库开发,并能有效地调试和优化软件,从而提升你的IT专业技能。

    C++调试详解

    1. **GDB调试器**:GDB(GNU调试器)是C++开发中最常用的命令行调试工具。学习如何启动、设置断点、单步执行、查看变量值、跟踪调用堆栈等操作,是每个C++开发者的基础技能。 2. **Visual Studio调试**:在Windows...

    本地ASP调试程序本地ASP调试程序

    9. **性能优化**:学习如何优化ASP代码,减少不必要的数据库查询,合理使用缓冲,避免内存泄漏,都是提高ASP程序性能的重要手段。 10. **安全考虑**:在本地调试时,也要考虑到安全性,避免在代码中使用可能导致...

Global site tag (gtag.js) - Google Analytics