java的线程状态
New新创建
创建一个Thread对象,但还未调用start()启动线程时,线程处于初始态。
Runnable可运行
在Java中,可运行态包括:Ready 和 Running
Ready就绪态
该状态下的线程已经获得执行所需的所有资源,CPU只要分配执行权就能运行。
所有就绪态的线程存放在就绪队列中。
Running运行中
已获得CPU执行权,正在被CPU执行的线程。
由于一个CPU同一时刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态的线程。
可以通过yield放弃CPU执行(例如在非抢占式操作系统中,需要由正在执行的线程主动放弃CPU)
Blocked被阻塞
注意是被动语态,当一条正在执行的线程请求某一资源失败时,就会进入阻塞态。
而在Java中,阻塞态专指请求锁失败时而被迫进入的状态。 (通常:锁、IO、Socket等都资源。但在这里仅涉及锁)
由一个阻塞队列存放所有阻塞态的线程。
处于阻塞态的线程会不断请求资源,一旦请求成功,就会进入Runnable-Ready就绪队列,等待执行。
Waiting等待中
当前线程中调用wait、join、park函数时,当前线程就会进入等待态。
也有一个等待队列存放所有等待态的线程。
线程处于等待态表示它需要等待其他线程的指示才能继续运行。需要由其他线程唤醒。
进入等待态的线程会释放CPU执行权,并释放资源(如:锁)
Timed wating计时等待
当运行中的线程调用sleep(time)、wait、join、parkNanos、parkUntil时,就会进入该状态;
它和等待态一样,并不是因为请求不到资源,而是主动进入。
进入该状态后释放CPU执行权 和 占有的资源。
与等待态的区别:到了设定时间后可自动进入Runnable-Ready
Terminated 被终止
包括运行结束自然终止,或者没有捕获异常而终止。
-----------------------------------------------------------------------------------------------------------
另外:
interrupt中断是一种机制,与这里的线程状态是不同层次的概念。
当对一个线程调用 interrupt 方法时,线程的中断状态将被置位。这是每一个线程都具有的 boolean 标志。每个线程都应该不时地检査这个标志(比如while循环), 以判断线程是否被中断。 但是, 如果线程被阻塞, 就无法检测中断状态。这是产生 InterruptedExceptioii 异常的地方。当在一个被阻塞的线程(调用 sleep 或 wait) 上调用 interrupt 方法时,阻塞调用将会被Interrupted Exception 异常中断。
获取pid
ps-ef|grep java
pid下的线程资源占用情况
top -Hp pid
将资源占用高这几个pid转为16进制
下载当前的java线程栈
查询16进制pid线程情况
java线程栈
jstack -l pid>/1.txt
导出堆快照
jmap -dump:live,format=b,file=./heap.hprof pid
查看资源占用最大前30对象
jmap -histo pid | head -30
分析
通过MAT或者Jprofile或者jdk自带工具分析堆文件,寻找无法被回收的对象