问题排查
1空间给够没
2找到代码问题 看死锁synchronized lock 看循环while (true)
top查看进程
top -Hp pid 查看进程中那个线程占用较高
17767 zhonghe 20 0 4943016 754804 12184 R 98.3 9.4 310:29.85 java
17672 zhonghe 20 0 4943016 754804 12184 R 94.7 9.4 310:12.15 java
转成16进制地址 jstack看堆栈实时日志
jstack -l pid > test.txt
查看到代码哪个方法有问题
"pool-2-thread-2"
java.lang.Thread.State: RUNNABLE
at java.lang.Thread.sleep(Native Method)
at com.hangmu.iorg.base.pickup.tcp.SocketHandler.onMessage(SocketHandler.java:210)
at com.hangmu.iorg.base.pickup.tcp.ClientSocket.run(ClientSocket.java:32)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
Locked ownable synchronizers:
- <0x0000000092c0abf8> (a java.util.concurrent.ThreadPoolExecutor$Worker)
socket 非阻塞读取消息 导致cpu飙升
while (true){
}
考虑添加一个等待或睡眠的时间来降低CPU的占用率!!!!
Thread.sleep(1);
CPU竞争有很多种策略。
Unix系统使用的是时间片算法 给每个进程分配一段时间,即该进程允许运行的时间 到时间就切走
Thread.Sleep 函数是干吗的呢?还用刚才的分蛋糕的场景来描述。上面的场景里面,5号MM在吃了一次蛋糕之后,觉得已经有8分饱了,她觉得在未来的半个小时之内都不想再来吃蛋糕了,那么她就会跟操作系统说:在未来的半个小时之内不要再叫我上来吃蛋糕了。
而Windows则属于抢占式的 进程得到Cpu 运行完才结束
Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权
nid:操作系统级别的线程id,是一个十六进制
关于线程的信息:
NEW:线程新建,还没开始运行
RUNNABLE:正在java虚拟机中运行的线程
BLOCKED :被阻塞,正在等待监视器锁的线程
WAITING :无限期等待另一个线程执行特定操作的线程
TIMED_WAITING:等待另一个线程执行操作达到指定等待时间的线程
TERMINATED:已经退出的线程