1 Jstack是JVM自带的可以查看线程运行情况的工具,线程死锁, 以及拿到线程dump来排查线程情况的工具。
当服务器上的cpu占用过大
1) top命令查看cpu占用过大的的进程
2) top -Hp pid ,查看这个pid下面所有线程占用cpu的情况
3)jstack -F 线程pid 拿到这个线程的堆栈情况,可以找到有个线程中有我们自己的包或类
4)分析这个线程状态信息,查看具体代码是否有问题
测试代码:
主类:
package com;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Hello world!
*
*/
public class App
{
static AtomicInteger count = new AtomicInteger(0);
static ExecutorService executor1 = Executors.newFixedThreadPool(10) ;
// Executor executor2 = Executors.newFixedThreadPool(10) ;
public static void main( String[] args )
{
Object lockObj = new Object();
TestThread1 testThread1 = new TestThread1(lockObj,"t_1");
TestThread1 testThread2 = new TestThread1(lockObj,"t_2");
executor1.execute(testThread1);
executor1.execute(testThread2);
}
}
2 线程类:
package com;
/**
* Created by admin on 2017/4/18.
*/
public class TestThread1 implements Runnable {
Object lockObj ;
String name;
public TestThread1(Object lockObj,String name ) {
this.lockObj = lockObj ;
this.name = name;
}
@Override
public void run() {
caculate();
}
public void caculate(){
while(true){
synchronized (lockObj){
// try {
// Thread.sleep(500);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
App.count.getAndAdd(1);
System.out.println( App.count.get() + " "+ name);
}
}
}
}
3) jar放到linux上,运行jar包 java -cp test-1.0-SNAPSHOT.jar com.App
4)