精华内容
下载资源
问答
  • kafka里还没有数据,原来是有死循环代码.如何定位呢?先top 找到占用CPU最大的进程top - 03:11:00 up 52 days, 17:50, 5 users, load average: 0.99, 0.97, 0.99Tasks: 149 total, 1 running, 148 sleeping, 0 s...

    kafaka consumer突然CPU占用100%..  kafka里还没有数据,原来是有死循环代码.

    如何定位呢?

    先top 找到占用CPU最大的进程

    top - 03:11:00 up 52 days, 17:50,  5 users,  load average: 0.99, 0.97, 0.99

    Tasks: 149 total,   1 running, 148 sleeping,   0 stopped,   0 zombie

    Cpu(s): 10.6%us, 15.1%sy,  0.0%ni, 74.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

    Mem:   3859888k total,  3362444k used,   497444k free,   186664k buffers

    Swap:   524280k total,   412704k used,   111576k free,   403636k cached

    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

    23485 root      20   0 2665m 425m  13m S  0.0 11.3  48:38.02 java

    28605 root      20   0 1654m 410m  16m S  0.0 10.9   0:17.55 java

    12862 root      20   0 2635m 393m 3516 S 100.6 10.4  21826:30 java

    20337 root      20   0 1681m 174m 5308 S  0.0  4.6  49:29.67 java

    19670 root      20   0 1630m 138m 4764 S  0.0  3.7  50:51.80 java

    0818b9ca8b590ca3270a3433284dd417.png

    然后查看这个进程下哪个线程占用的资源最多top -Hp 12862

    [root@tsbqacdhhbm1 ~]# top -Hp 12862

    top - 03:16:07 up 52 days, 17:55,  5 users,  load average: 0.99, 0.97, 0.99

    Tasks:  47 total,   1 running,  46 sleeping,   0 stopped,   0 zombie

    Cpu(s):  9.4%us, 16.3%sy,  0.0%ni, 74.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

    Mem:   3859888k total,  3356104k used,   503784k free,   187052k buffers

    Swap:   524280k total,   412620k used,   111660k free,   403724k cached

    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

    12907 root      20   0 2635m 393m 3576 R 100.2 10.4  21520:32 java

    13878 root      20   0 2635m 393m 3576 S  0.3 10.4  12:27.99 java

    12862 root      20   0 2635m 393m 3576 S  0.0 10.4   0:00.00 java

    12863 root      20   0 2635m 393m 3576 S  0.0 10.4   0:01.96 java

    0818b9ca8b590ca3270a3433284dd417.png

    定位到12907这个线程  把它转化成16进制是 326b

    用 jstack -l 12862 > jstack.log; 生成线程堆栈日志文件

    打开jstack.log文件  搜索0x326b

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    "pool-3-thread-2" prio=10 tid=0x00007fb780235000 nid=0x326b runnable [0x00007fb7c89c2000]

    java.lang.Thread.State: RUNNABLE

    at com.elasticsearch.river.kafka.KafkaRiver$UpLoadFileWorker.run(KafkaRiver.java:303)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

    at java.lang.Thread.run(Thread.java:744)

    Locked ownable synchronizers:

    - <0x00000000f04077f8> (a java.util.concurrent.ThreadPoolExecutor$Worker)

    定位到死循环的代码块,原因是没有sleep....

    展开全文
  • 如何定位死循环或高CPU使用率(linux)确定是CPU过高使用top观察是否存在CPU使用率过高现象找出线程对CPU使用率过高的进程的所有线程进行排序ps H -e -o pid,tid,pcpu,cmd --sort=pcpu |grep xxx得到如下结果,其中线程...

    如何定位死循环或高CPU使用率(linux)

    确定是CPU过高

    使用top观察是否存在CPU使用率过高现象

    找出线程

    对CPU使用率过高的进程的所有线程进行排序

    ps H -e -o pid,tid,pcpu,cmd --sort=pcpu |grep xxx

    得到如下结果,其中线程2909使用了7.8%的CPU.

    2907 2913 0.0 ./xxx

    2907 2909 7.8 ./xxx

    也可以通过查看/proc中的信息来确定高CPU线程. 打印了4列,线程ID,线程名,用户时间和内核时间(排名未分先后)

    awk '{print $1,$2,$14,$15}' /proc/2907/task/*/stat

    找出调用栈

    使用gdb attach nmsagent所在的进程,在gdb中使用 info threads显示所有线程

    gdb gdb>attach 2907

    gdb>info threads

    得到如下结果,可以发现2909线程的编号是12

    13 Thread 0xad5f2b70 (LWP 2908) 0x004ef0d7 in mq_timedreceive () from /lib/tls/i686/cmov/librt.so.1

    12 Thread 0xad58eb70 (LWP 2909) 0x006e0422 in __kernel_vsyscall ()

    11 Thread 0xad52ab70 (LWP 2910) 0x006e0422 in __kernel_vsyscall ()

    10 Thread 0xad4f8b70 (LWP 2911) 0x006e0422 in __kernel_vsyscall ()

    9 Thread 0xad4c6b70 (LWP 2912) 0x006e0422 in __kernel_vsyscall ()

    8 Thread 0xad3feb70 (LWP 2913) 0x004ef0d7 in mq_timedreceive () from /lib/tls/i686/cmov/librt.so.1

    7 Thread 0xace08b70 (LWP 2914) 0x004ef0d7 in mq_timedreceive () from /lib/tls/i686/cmov/librt.so.1

    6 Thread 0xac607b70 (LWP 2915) 0x006e0422 in __kernel_vsyscall ()

    5 Thread 0xac5e6b70 (LWP 2916) 0x006e0422 in __kernel_vsyscall ()

    4 Thread 0xac361b70 (LWP 2917) 0x006e0422 in __kernel_vsyscall ()

    3 Thread 0xac2fdb70 (LWP 2918) 0x006e0422 in __kernel_vsyscall ()

    2 Thread 0xac1fcb70 (LWP 2919) 0x004ef0d7 in mq_timedreceive () from /lib/tls/i686/cmov/librt.so.1

    * 1 Thread 0xb78496d0 (LWP 2907) 0x006e0422 in __kernel_vsyscall ()

    使用thread 切换线程,使用bt显示线程栈

    gdb>thread 12 gdb>bt

    得到如下线程栈

    #0 0x006e0422 in __kernel_vsyscall ()

    #1 0x001cca26 in nanosleep () from /lib/tls/i686/cmov/libc.so.6

    #2 0x001fc2dc in usleep () from /lib/tls/i686/cmov/libc.so.6

    #3 0x0806b510 in OspTaskDelay ()

    #4 0x0805c710 in CDispatchTask::NodeMsgSendToSock() ()

    #5 0x0805cc74 in DispatchTaskEntry ()

    #6 0x0806a8e9 in OspTaskTemplateFunc(void*) ()

    #7 0x00d4780e in start_thread () from /lib/tls/i686/cmov/libpthread.so.0

    #8 0x002027ee in clone () from /lib/tls/i686/cmov/libc.so.6

    ps + strace

    得到进程ID 21465 ps -e |grep cmu 4996 ? 00:00:25 cmu_fjga_sp3 21465 pts/5 00:08:10 cmu

    得到线程时间, 其中最占CPU的是 EpollRecvTask 21581

    ps -eL |grep 21465

    21465 21579 pts/5 00:00:00 CamApp

    21465 21580 pts/5 00:00:00 TimerMan Task

    21465 21581 pts/5 00:09:02 EpollRecvTask

    21465 21582 pts/5 00:00:00

    使用 strace -p 21581 得到线程栈

    展开全文
  • 当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,...死循环写个死循环的程序如下:packageconcurrency;public classTest {public static void main(String[] args) throwsInterruptedException {whi...

    当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的jstack工具去定位;

    废话不说,直接上例子吧,在window平台上的;

    死循环

    写个死循环的程序如下:

    packageconcurrency;public classTest {public static void main(String[] args) throwsInterruptedException {while (true) {

    }

    }

    }

    先运行以上程序,程序进入死循环;

    打开cmd,输入jps命令,jps很简单可以直接显示java进程的pid,如下为7588:

    cc4ac9a0c998e7879ca9961c70b1a0f2.png

    或者输入tasklist,找到javaw.exe的PID,如下为7588:

    7affca26e95a32566e31b8a0a3885773.png

    输入jstack 7588命令,找到跟我们自己代码相关的线程,如下为main线程,处于runnable状态,在main方法的第八行,也就是我们死循环的位置:

    310eba4ff243f258bc54629a10399f15.png

    Object.wait()情况

    写个小程序,调用wait使其中一线程等待,如下:

    packageconcurrency;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;class TestTask implementsRunnable {

    @Overridepublic voidrun() {synchronized (this) {try{//等待被唤醒

    wait();

    }catch(InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    }public classTest {public static void main(String[] args) throwsInterruptedException {

    ExecutorService ex= Executors.newFixedThreadPool(1);

    ex.execute(newTestTask());

    }

    }

    同样我们先找到javaw.exe的PID,再利用jstack分析该PID,很快我们就找到了一个线程处于WAITING状态,在Test.java文件13行处,正是我们调用wait方法的地方,说明该线程目前还没等到notify,如下:

    d83c9344241d86e72ea7d744f510c07a.png

    死锁

    写个简单的死锁例子,如下:

    packageconcurrency;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;class TestTask implementsRunnable {privateObject obj1;privateObject obj2;private intorder;public TestTask(intorder, Object obj1, Object obj2) {this.order =order;this.obj1 =obj1;this.obj2 =obj2;

    }public void test1() throwsInterruptedException {synchronized(obj1) {//建议线程调取器切换到其它线程运行

    Thread.yield();synchronized(obj2) {

    System.out.println("test。。。");

    }

    }

    }public void test2() throwsInterruptedException {synchronized(obj2) {

    Thread.yield();synchronized(obj1) {

    System.out.println("test。。。");

    }

    }

    }

    @Overridepublic voidrun() {while (true) {try{if(this.order == 1){this.test1();

    }else{this.test2();

    }

    }catch(InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    }public classTest {public static void main(String[] args) throwsInterruptedException {

    Object obj1= newObject();

    Object obj2= newObject();

    ExecutorService ex= Executors.newFixedThreadPool(10);//起10个线程

    for (int i = 0; i < 10; i++) {int order = i%2==0 ? 1 : 0;

    ex.execute(newTestTask(order, obj1, obj2));

    }

    }

    }

    同样我们先找到javaw.exe的PID,再利用jstack分析该PID,很快jstack就帮我们找到了死锁的位置,如下所示:

    e99309947c3fbacf8bea985c9a120c8f.png

    等待IO

    写个简单的等待用户输入例子:

    packageconcurrency;importjava.io.IOException;importjava.io.InputStream;public classTest {public static void main(String[] args) throwsInterruptedException, IOException {

    InputStream is=System.in;int i =is.read();

    System.out.println("exit。");

    }

    }

    同样我们先找到javaw.exe的PID,再利用jstack分析该PID,很快jstack就帮我们找到了位置,Test.java文件12行,如下所示:

    b5c09f9720812948019a5048dd921781.png

    其它

    像调用sleep使线程进入睡眠,suspend()暂停线程等就不举例了,都是类似的;

    原文:http://www.cnblogs.com/chenpi/p/5377445.html

    展开全文
  • 定位java中的死循环

    千次阅读 2016-09-02 12:11:28
    kafka里还没有数据,原来是有死循环代码.  如何定位呢? 先top 找到占用CPU最大的进程 然后查看这个进程下哪个线程占用的资源最多 定位到12907这个线程 把它转化成16进制是 326b 用 jstack -l 12862 > ...

    kafaka consumer突然CPU占用100%..  kafka里还没有数据,原来是有死循环代码. 

    如何定位呢?


    先top 找到占用CPU最大的进程

    top - 03:11:00 up 52 days, 17:50,  5 users,  load average: 0.99, 0.97, 0.99

    Tasks: 149 total,   1 running, 148 sleeping,   0 stopped,   0 zombie

    Cpu(s): 10.6%us, 15.1%sy,  0.0%ni, 74.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

    Mem:   3859888k total,  3362444k used,   497444k free,   186664k buffers

    Swap:   524280k total,   412704k used,   111576k free,   403636k cached


      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                     

    23485 root      20   0 2665m 425m  13m S  0.0 11.3  48:38.02 java                                                                                                         

    28605 root      20   0 1654m 410m  16m S  0.0 10.9   0:17.55 java                                                                                                         

    12862 root      20   0 2635m 393m 3516 S 100.6 10.4  21826:30 java                                                                                                        

    20337 root      20   0 1681m 174m 5308 S  0.0  4.6  49:29.67 java                                                                                                         

    19670 root      20   0 1630m 138m 4764 S  0.0  3.7  50:51.80 java  


                                                                                                      


    然后查看这个进程下哪个线程占用的资源最多 top -Hp 12862

    [root@tsbqacdhhbm1 ~]# top -Hp 12862


    top - 03:16:07 up 52 days, 17:55,  5 users,  load average: 0.99, 0.97, 0.99

    Tasks:  47 total,   1 running,  46 sleeping,   0 stopped,   0 zombie

    Cpu(s):  9.4%us, 16.3%sy,  0.0%ni, 74.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

    Mem:   3859888k total,  3356104k used,   503784k free,   187052k buffers

    Swap:   524280k total,   412620k used,   111660k free,   403724k cached


      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                     

    12907 root      20   0 2635m 393m 3576 R 100.2 10.4  21520:32 java                                                                                                        

    13878 root      20   0 2635m 393m 3576 S  0.3 10.4  12:27.99 java                                                                                                         

    12862 root      20   0 2635m 393m 3576 S  0.0 10.4   0:00.00 java                                                                                                         

    12863 root      20   0 2635m 393m 3576 S  0.0 10.4   0:01.96 java 

      



    定位到12907这个线程  把它转化成16进制是 326b

    用 jstack -l 12862 > jstack.log; 生成线程堆栈日志文件

    打开jstack.log文件  搜索0x326b


    "pool-3-thread-2" prio=10 tid=0x00007fb780235000 nid=0x326b runnable [0x00007fb7c89c2000]

       java.lang.Thread.State: RUNNABLE

            at com.elasticsearch.river.kafka.KafkaRiver$UpLoadFileWorker.run(KafkaRiver.java:303)

            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

            at java.lang.Thread.run(Thread.java:744)


       Locked ownable synchronizers:

            - <0x00000000f04077f8> (a java.util.concurrent.ThreadPoolExecutor$Worker)


    定位到死循环的代码块,原因是没有sleep....


    展开全文
  • 当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,...死循环写个死循环的程序如下: packageconcurrency;public classTest {public static void main(String[] args) throwsInterruptedException {wh...
  • Java死循环执行in.available()导致CPU占满-解决办法 问题详细 发现Java应用服务器常年cpu占满的状态,执行top命令发现是某个java进程占满cup资源。如果网络请求并发大的话,可能直接导致宕机 具体原因 通过几行linux...
  • jstack主要用于生成线程快照,这样可以定位长时间停顿的原因,比如死锁或者死循环。jstack的命令格式jstack [ options ] pid我在代码里特意写了个死循环,代码如下:/** * Created by kevin on 1
  • 使用的大神的代码,jstack可以看到堆栈信息运行到哪里了,正好对应死循环里面的sleep,多次查看可以看到无法跳出死循环,如下: import java.io.IOException; import static java.lang.Thread.sleep; /** * @...
  • 当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,...死循环写个死循环的程序如下:packageconcurrency;public classTest {public static void main(String[] args) throwsInterruptedException {whi...
  • 当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的jstack工具去定位; 废话不说,直接上例子吧,在window平台上的; 死循环 写个死循环的程序如下: package ...
  • 根据直接,第一反应就是某位小哥哥的代码写法出现了问题导致了死循环一直占用CPU。 项目运行环境是Tomcat8,服务直接打成war包丢进去运行的。 话不说说,进入正题, 1、登录进入服务器 ssh … 2、查看进程占用资源 ...
  • 面试官问曰:“尔可知如何定位JAVA程序的死循环?”。思虑良久,未有良策,回来查阅了下资料,经过一番曲折感觉自己解决问题的能力又提高了不少。以下是个例子,不一定很合适但足以说明一些问题。 1、查看进程ID: ...
  • 当我们运行java程序时,可能会出现死循环,IO阻塞,线程死锁等问题,导致程序无法进行下去,但从代码上有无法确定问题出现的具体... * 死循环定位 */ public class Test01 { public static void main(String[] ar...
  • 当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的jstack工具去定位; 废话不说,直接上例子吧,在window平台上的; 死循环 写个死循环的程序如下: package ...
  • 生成线程快照的主要目的是用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致长时间等待。基础线程的几种状态NEW,未启动的。不会出现在Dump中。RUNNABLE,在虚拟机内执行的。BLOCKED,受阻塞...
  • 最近在学习jdk的动态代理, 自己写了一个Demo后, 发现程序陷入了递归, 通过分析源码后, 成功定位并解决了问题, 也加深了自己对动态代理的理解. 代码 书写动态代理的一般步骤 定义接口, 如下面代码的Task接口,确定...
  • 一、问题描述最近接手了一个系统,线上有个定时循环执行的Java服务端程序,采用Spring+Quartz每五分钟计算一次。计算采用多线程执行,所有线程执行完成则当次任务执行完成,并记录计算结果的时间。在程序运行过程中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 405
精华内容 162
关键字:

java死循环定位

java 订阅