实战死循环导致CPU飙高和死锁

CPU飙高

执行死循环的jar

[root@storm-nimbus-a opt]# java -jar  cpu.jar 2>&1 &

[1] 12507

[root@storm-nimbus-a opt]# java -jar  cpu.jar 2>&1 &

[2] 12526

[root@storm-nimbus-a opt]# jps

12507 jar

12526 jar

查找cpu过高的进程

top

网站中:如果负载(load)过大,将不能处理新的请求

发现 12507 和 12526 cpu占有率过高

jstack

[root@storm-nimbus-a opt]# jstack 12507 > /opt/12507.txt

用jstack导出相关信息

[root@storm-nimbus-a opt]# top -p 12507 –H

发现12508(十进制,需转换十六进制)                                                                                               

[root@storm-nimbus-a opt]#  printf "%x"  12508

30dc

在/opt/12507.txt定位该线程正在做什么

"main" #1 prio=5 os_prio=0 tid=0xb7606400 nid=0x30dc runnable [0xb7783000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.String.indexOf(String.java:1759)
	at java.lang.String.indexOf(String.java:1705)
	at com.pcitc.Cpu.getPartneridsFromJson(Cpu.java:45)
	at com.pcitc.Cpu.main(Cpu.java:15)

死锁代码

public class deadlock {
	private Object lock1 = new Object();
	private Object lock2 = new Object();
	
	public static void main(String[] args) {
		System.out.println("死锁演示");
		deadlock test = new deadlock();
        MyThread1 thread1 = test.new MyThread1();
        MyThread2 thread2 = test.new MyThread2();
        thread1.start();
        thread2.start();	 
	}
		
    class MyThread1 extends Thread{
        @Override
        public void run() {
			synchronized(lock1) {
				try {Thread.sleep(1000);}catch(Exception e) {}
				synchronized(lock2) {
					System.out.println("Thread1 over");
				}
			}
        }
    }
    
    class MyThread2 extends Thread{
        @Override
        public void run() {
			synchronized(lock2) {
				try {Thread.sleep(1000);}catch(Exception e) {}
				synchronized(lock1) {
					System.out.println("Thread2 over");
				}
			}
        }
    }
}

两个线程相互等待对方持有的锁,形成死锁
执行死锁的jar并定位

[root@storm-nimbus-a opt]# java -jar deadlock.jar 2>&1 &

[1] 12900

[root@storm-nimbus-a opt]# jstack 12900 > /opt/12900.txt

查看相关日志/opt/12900.txt

Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x08c6ab70 (object 0xa54b3d00, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x08c691b4 (object 0xa54b3d08, a java.lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
	at com.pcitc.deadlock$MyThread2.run(deadlock.java:42)
	- waiting to lock <0xa54b3d00> (a java.lang.Object)
	- locked <0xa54b3d08> (a java.lang.Object)
"Thread-0":
	at com.pcitc.deadlock$MyThread1.run(deadlock.java:30)
	- waiting to lock <0xa54b3d08> (a java.lang.Object)
	- locked <0xa54b3d00> (a java.lang.Object)

Found 1 deadlock.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值