zoukankan      html  css  js  c++  java
  • 查找占用资源高的JAVA代码

    1. /tmp/hsperfdata_$USER目录

    $USER是启动JAVA进程的用户,这里保存的所有用户启动的JAVA进程。

    这些都JAVA进程的PID,里面存放的是JVM进程信息。你所用的jsp、jstack、jmap这些工具都会读取这个目录中对应PID的文件获取连接信息。
    有时候你会发现这样的错误

    这种情况是你使用的是一个JAVA的线程号而不是一个进程号。因为jstack、jps、jmap这些工具都是使用进程号的。
    如果你提供了一个根本不存在的进程号呢?它会告诉你无此进程。

    这种情况是你使用的是一个JAVA的线程号而不是一个进程号。因为jstack、jps、jmap这些工具都是使用进程号的。
    如果你提供了一个根本不存在的进程号呢?它会告诉你无此进程。

    2. 如何查找消耗资源的代码

    通过top命令获取消耗资源最大的PID号

    通过top –p PID –H来查看指定进程中最消耗资源的线程

    把线程ID转换为16进制

    printf '0x%x
    ' PID

    查找代码

    如果同一个JAVA进程中有多个占用CPU资源多的线程,那么你就把线程号保存到一个文件中,一行一个号。然后运行下面的命令.
    找到线程号,转换成十六进制保存到文件里

    保存堆栈信息到文件

    查找,写一个循环进程查找

    while read LINE; do grep $LINE /tmp/stock.txt ; done < /tmp/threadNum.txt

    字段中第一个引号字段就是JAVA线程的名字。由于我这里其实只是展示一下操作过程实际上并没有消耗CPU高的线程,你会看到比较少的信息,如果真的有消耗CPU高的线程,这里会有很多同名的Java线程名称。也不能说是名称完全一样只是主名称相同后面还是有区分的。

    3. 堆栈信息说明

    prio=N 表示线程的优先级别
    os_prio=N 表示线程的操作系统优先级别
    tid= 表示线程ID
    nid= 表示操作系统影视的线程ID,非常关键,你在top –H –p PID 查看的数字转换为十六进制就是这个

    状态 说明
    New 线程对象刚刚创建时的状态,此时不可执行
    Runnable 表示线程具备所有运行条件,在队列中等待CPU调度
    Running 正在运行
    Wait on condition 该线程在等待某个条件发生,发生后就可以运行,但具体什么条件需要进一步查看。最常见的就是线程在等待网络的读写,比如网络数据没有准备好,线程处于等待状态,一旦数据准备好线程会被重新激活。
    Waiting for monitor entry和In Object.wait()

    Monitor是JAVA中实现线程互斥与协调的手段,可以看成对象或者class的锁。每个对象都有,也仅有一个monitor。每个Monitor在某个时刻只能被一个线程拥有,该线程叫做Active Thread,而其他线程叫做“Waiting Tread”,分别在2个队列中“Entry Set”和“Wait Set”里面。在前者队列的线程状态时“Waiting for monitor entry”,在后者队列的线程状态是“in Object.wait()”

    Wating on monitor entry:正在等待锁
    In Object.wait():获取锁以后又执行了obj.wait()放弃锁

    4. 关于“Unable to open socket file: target process not responding or HotSpot VM not loaded”问题

    遇到这个问题可能有几个原因:

    1. 运行该命令的用户账号和启动指定进程的用户账号不一致。也就是PID  145784这个进程是通过其他账号启动的,而不是当前你用的账号
    2. /tmp/hsperfdata_$USER这个目录里的内容被清理,这里放的就是启动进程的进程号,由于是临时目录有可能Linux系统定期清理导致进程号文件没有了,所以会打印堆栈信息失败。因为jps和jstack等工具会读取这个目录里面指定进程号的PID文件获取连接信息。
    3. 确保你使用的命令的JDK版本和运行JAVA程序的JDK版本一致。

    其实通过第二条就知道为什么第一条存在,因为不同用户会有不同目录,你用root账号虽然权限大,但是它会读取/tmp/hsperfdata_root目录,而你需要打印堆栈的程序是用其他账号启动的,所以用root会报错。
    切换账号后打印成功

  • 相关阅读:
    经典算法之七大排序
    Memcached在Asp.NET中的使用
    利用memcached构建高性能的Web应用程序(转)
    C# 反射机制
    数据库事务设置保存点
    C# 串口通信总结
    某投注网站的BUG
    浙江电信网上营业厅的一个BUG(有更新)
    解决DESCryptoServiceProvider加解密时弱密钥异常
    ASP.NET自定义控件开发示例(二)
  • 原文地址:https://www.cnblogs.com/rexcheny/p/9384351.html
Copyright © 2011-2022 走看看