精华内容
下载资源
问答
  • linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找:(一):通过【top -p 12377 -H】 查看java进程的有哪些线程的运行情况;和通过【jstack ...

    76575772_2

    作者:张振华(Jack)

    这里对linux下、sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结;

    linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找:

    (一):通过【top -p 12377 -H】 查看java进程的有哪些线程的运行情况;

    和通过【jstack 12377 > stack.log】生成Java线程的dump详细信息;先用top命令找出占用资源厉害的java进程id,如图:# top

    76575772_3

    如上图所示,java的进程id为'52554',接下来用top命令单独对这个进程中的所有线程作监视:

    1top -p 52554 -H# top视图里面里面可以通过快捷键依次b ,x高亮显示top的列找出需要的线程,默认CPU排序,Shift+< ,Shift+>可以左右移动高亮排序的列;如图:(这时就看出来哪个java线程CPU高,哪个线程内存用的多)

    76575772_4

    如上图所示,linux下,所有的java内部线程,其实都对应了一个进程id,也就是说,linux上的sun jvm将java程序中的线程映射为了操作系统进程;我们看到,占用CPU资源最高的那个进程id是'15417',这个进程id对应java线程信息中的'nid'('n' stands for 'native');

    (1)要想找到到底是哪段具体的代码占用了如此多的资源,先使用jstack打出当前栈信息到一个文件里, 比如stack.log:1jstack 52554 > stack.log然后使用'jtgrep'脚本把这个进程号为'9757'的java线程在stack.log中抓出来:1jtgrep 9757 stack.log

    76575772_5

    其中,'jtgrep'是自己随便写的一个shell脚本:1#!/bin/sh3nid=`python -c"print hex($1)"`4grep -i $nid $2

    道理很简单,就是把'9757'转换成16进制后,直接grep stack.log;可以看到,被grep出的那个线程的nid=0x3c39,正好是15417的16进制表示。(2) 通过(windows程序-->计算器),选择程序员计算器将进程ID转换成16进制 到dump里面的nid就可以搜索到"http-nio-8080-exec-25" daemon prio=10 tid=0x00007f69686b4800 nid=0x1ce5 waiting on condition [0x00007f698e7cf000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x0000000777063ec8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(Unknown Source)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)at java.util.concurrent.LinkedBlockingQueue.take(Unknown Source)at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.lang.Thread.run(Unknown Source)

    (二)第二种通过Java visualMv结合jconsole.exe 工具即可查看如图所示;(第一种方式可能更准确一些)

    76575772_6

    76575772_7

    76575772_8

    三:在Java Visualvm工具里面安装JTA插件,分析线程dump文件,注意,正常阶段的dump文件与非正常时期的Dump文件进行比较更容易分析出问题:

    (1)下载:https://java.net/projects/tda/downloads/directory/visualvm

    (2)安装与使用:

    (3)使用:

    76575772_9

    四:直接通过tda-bin-2.2\bin\tda.sh 来分析导出ThreadDump文件;(在没有JMX监控的情况下手动查看threadDump信息)

    下载地址:https://java.net/projects/tda/downloads/directory/visualvm

    76575772_10

    展开全文
  • Linux环境下,当发现java进程占用CPU资源非常高,且又要想更进一步查出哪一个java线程占用了CPU资源时该如何做呢? 一、采用命令行形式查看线程,最终用dump进行文本分析 1、top命令既可以看进程,又可以看线程 1、...

    Linux环境下,当发现java进程占用CPU资源非常高,且又要想更进一步查出哪一个java线程占用了CPU资源时该如何做呢?

    一、采用命令行形式查看线程,最终用dump进行文本分析

    1、top命令既可以看进程,又可以看线程
    1、top命令找出占用资源厉害的java进程id

    # top
    

    在这里插入图片描述
    2、上图所看到的。java的进程id为’52554’,接下来用top命令单独对这个进程中的全部线程作监视

    top -p 52554 -H
    

    在这里插入图片描述
    如上图所看到的,linux下,全部的java内部线程,事实上都相应了一个进程id,也就是说,linux上的sun jvm将java程序中的线程映射为了操作系统进程;我们看到。占用CPU资源最高的那个进程id是’9758’,这个进程id值对应java线程信息中的’nid’(‘n’ stands for ‘native’);

    2、jstack打出当前栈信息到一个文件中

    要想找到究竟是哪段详细的代码占用了如此多的资源,先使用jstack打出当前栈信息到一个文件中, 比方stack.log:

     jstack 52554 > stack.log
    

    3、在文件中找到对应线程的位置

    jtgrep 9758 stack.log
    

    其中jtgrep是自己写的shell脚本

    #!/bin/sh
    nid=`python -c "print hex($1)"`
    grep -i $nid $2
    

    非常easy,就是把’9758’转换成16进制后,直接grep stack.log;能够看到,被grep出的那个线程的nid=0x3c39。正好是9758的16进制表示。

    或者通过(windows程序–>计算器),选择程序猿计算器将进程ID转换成16进制 到dump里面的nid 就能够搜索到。

    "http-nio-8080-exec-25" daemon prio=10 tid=0x00007f69686b4800 nid=0x1ce5 waiting on condition [0x00007f698e7cf000]
       java.lang.Thread.State: WAITING (parking)
            at sun.misc.Unsafe.park(Native Method)
            - parking to wait for  <0x0000000777063ec8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
            at java.util.concurrent.locks.LockSupport.park(Unknown Source)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
            at java.util.concurrent.LinkedBlockingQueue.take(Unknown Source)
            at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
            at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
            at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
            at java.lang.Thread.run(Unknown Source)
    

    二、通过 Java visualMv结合jconsole.exe 工具可以图形化实时查看线程信息
    在这里插入图片描述
    其中的dump文件也可以用专门的工具进行分析。
    1、在Java Visualvm工具里面安装JTA插件,分析线程dump文件;

    2、直接通过tda-bin-2.2\bin\tda.sh 来分析导出ThreadDump文件;
    下载地址:https://java.net/projects/tda/downloads/directory/visualvm
    在这里插入图片描述
    参考:
    Linux下Java线程具体监控和其dump的分析使用----分析Java性能瓶颈[张振华-Jack]

    展开全文
  • linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: (一):通过【top-p 12377 -H】 查看java进程的有哪些线程的运行情况; 和通过...
    这里对linux下、sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结;
    linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找:
    (一):通过【 top  -p 12377 -H】 查看java进程的有哪些线程的运行情况;
          和通过【jstack 12377 > stack.log】生成Java线程的dump详细信息;
      1. 先用top命令找出占用资源厉害的java进程id,如图:# top
      2. 如上图所示,java的进程id为’52554′,接下来用top命令单独对这个进程中的所有线程作监视:
    1. 1 top  -p 52554 -H

      #  top视图里面里面可以通过快捷键依次b ,x高亮显示top的列找出需要的线程,默认CPU排序,Shift+< ,Shift+>可以左右移动高亮排序的列;

      如图:(这时就看出来哪个java线程CPU高,哪个线程内存用的多)

    2. 如上图所示,linux下,所有的java内部线程,其实都对应了一个进程id,也就是说,linux上的sun jvm将java程序中的线程映射为了操作系统进程;我们看到,占用CPU资源最高的那个进程id是’15417′,这个进程id对应java线程信息中的’nid’(‘n’ stands for ‘native’);
    3. (1)要想找到到底是哪段具体的代码占用了如此多的资源,先使用jstack打出当前栈信息到一个文件里, 比如stack.log:

      1

      jstack 52554 > stack.log

      然后使用’jtgrep’脚本把这个进程号为’9757′的java线程在stack.log中抓出来:

      1 jtgrep 9757 stack.log

      其中,’jtgrep’是自己随便写的一个shell脚本:

      1 #!/bin/sh
      3 nid=`python -c  "print hex($1)" `
      4 grep  -i $nid $2

      道理很简单,就是 把’9757′转换成16进制后,直接grep stack.log;可以看到,被grep出的那个线程的nid=0x3c39,正好是15417的16进制表示。

    (2) 通过(windows程序–>计算器),选择程序员计算器将进程ID转换成16进制 到dump里面的nid 就可以搜索到

    “http-nio-8080-exec-25″ daemon prio=10 tid=0x00007f69686b4800 nid=0x1ce5 waiting on condition [0x00007f698e7cf000]

       java.lang.Thread.State: WAITING (parking)

            at sun.misc.Unsafe.park(Native Method)

            – parking to wait for  <0x0000000777063ec8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)

            at java.util.concurrent.locks.LockSupport.park(Unknown Source)

            at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)

            at java.util.concurrent.LinkedBlockingQueue.take(Unknown Source)

            at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)

            at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)

            at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)

            at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

            at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

            at java.lang.Thread.run(Unknown Source)

    (二)第二种通过 Java visualMv结合 jconsole.exe   工具即可查看如图所示;(第一种方式可能更准确一些)

    三:在Java Visualvm工具里面安装JTA插件,分析线程dump文件,注意,正常阶段的dump文件与非正常时期的Dump文件进行比较更容易分析出问题:
    (1)下载:https://java.net/projects/tda/downloads/directory/visualvm
      (2)安装与使用:
    (3)使用:
    四:直接通过tda-bin-2.2\bin\tda.sh 来分析导出ThreadDump文件;(在没有JMX监控的情况下手动查看threadDump信息)
           下载地址:https://java.net/projects/tda/downloads/directory/visualvm
     

    转载于:https://www.cnblogs.com/wuchangsoft/p/10212797.html

    展开全文
  • 计算器),选择程序员计算器将进程ID转换成16进制 到dump里面的nid就可以搜索到“http-nio-8080-exec-25″ daemon prio=10 tid=0x00007f69686b4800 nid=0x1ce5 waiting on condition [0x00007f698e7cf000]java.lang....

    (2) 通过(windows程序–>计算器),选择程序员计算器将进程ID转换成16进制 到dump里面的nid 就可以搜索到

    “http-nio-8080-exec-25″ daemon prio=10 tid=0x00007f69686b4800 nid=0x1ce5 waiting on condition [0x00007f698e7cf000]

    java.lang.Thread.State: WAITING (parking)

    at sun.misc.Unsafe.park(Native Method)

    – parking to wait for  <0x0000000777063ec8>

    (a

    java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)

    at java.util.concurrent.locks.LockSupport.park(Unknown Source)

    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)

    at java.util.concurrent.LinkedBlockingQueue.take(Unknown Source)

    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)

    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)

    at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

    at java.lang.Thread.run(Unknown Source)

    展开全文
  • 4.Linux监控常用的操作 netstat -natp : 查看对应的网络链接 lsof -p pid : 查找对应pid的文件句柄 lsof -i : 80 : 查找对应端口被哪个进程占用 lsof /tmp/1.txt :查找对应文件被哪个进程占用 查看所有存在的线程...
  • 4.Linux监控常用的操作 netstat -natp : 查看对应的网络链接 lsof -p pid : 查找对应pid的文件句柄 lsof -i : 80 : 查找对应端口被哪个进程占用 lsof /tmp/1.txt :查找对应文件被哪个进程占用 查看所有存在的线程...
  • linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: (一):通过【 top -p 12377 -H】 查看java进程的有哪些线程的运行情况;  和通过...
  • linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: (一):通过【top-p 12377 -H】 查看java进程的有哪些线程的运行情况; 和通过...
  • 4.Linux监控常用的操作 netstat -natp : 查看对应的网络链接 lsof -p pid : 查找对应pid的文件句柄 lsof -i : 80 : 查找对应端口被哪个进程占用 lsof /tmp/1.txt :查找对应文件被哪个进程占用 查看所有存在的线程...
  • linux环境下,当发现java进程占用CPU资源非常高,且又要想更进一步查出哪一个java线程占用了CPU资源时,依照下面步骤进行查找: (一):通过【top-p 12377 -H】 查看java进程的有哪些线程的执行情况。 ...
  • linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: (一):通过【 top -p 12377 -H】 查看java进程的有哪些线程的运行情况;  和通过...
  • Linux进程查看命令 PS命令 1.不带参数的ps使用 2.显示所有的当前进程 ps –ax -a 代表 all。同时加上x参数会显示没有控制终端的进程。 ps -ax | less 可以结合less命令和管道来使用以方便查看。 3.通过cpu和...
  • >>Linux监控常用的操作 netstat -natp : 查看对应的网络链接 lsof -p pid : 查找对应pid的文件句柄 lsof -i : 80 : 查找对应端口被哪个进程占用 lsof /tmp/1.txt :查找对应文件被哪个进程占用 查看所有存在的线程...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 318
精华内容 127
热门标签
关键字:

linux监控java线程

java 订阅
linux 订阅