1.查询linux下java相关进程
命令: ps -ef |grep java
ps -ef |grep java
[root@bug-205 mms]# ps -ef | grep java #查询
root 4658 782 0 17:47 pts/3 00:00:00 grep --color=auto java
root 23321 1 0 11月10 ? 02:05:47 java -jar -Xms512m -Xmx512m -XX:+PrintGCDetails monitor-rest-3.0.jar --service.eureka.defaultZone=http://192.168.1.205:8761/eureka/
root 23395 1 0 11月10 ? 01:28:38 java -jar -Xms512m -Xmx512m -XX:+PrintGCDetails turbine-rest-3.0.jar --service.eureka.defaultZone=http://192.168.1.205:8761/eureka/
还有一个命令: jps -l
## 算了不贴了,你们自己 man jps 查看这个命令的相关参数吧
[root@bug-205 ~]# man jps
[root@bug-205 ~]# jps -l
30227 registry-3.0.jar
23395 turbine-rest-3.0.jar
6004 mms-client-1.0.0-SNAPSHOT.jar
->用来确认你的项目jar包名称对应的pid非常滴银性化
2.拿到进程id后查询所有线程状态 jstack pid
命令:jstack pid
jstack pid #
[root@bug-205 mms]# jstack 32603(这个就是pid)
2021-12-13 17:48:21
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.161-b12 mixed mode):
"AsyncResolver-bootstrap-executor-0" #95 daemon prio=5 os_prio=0 tid=0x00007fc338002800 nid=0xd0c waiting on condition [0x00007fc32a9ec000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007bdf57c70> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
3.java.lang.Thread.State: RUNNABLE 也可能是阻塞中
"RedisClearGroup-1" #83 prio=10 os_prio=0 tid=0x00007fd7c8055800 nid=0x4460 runnable [0x00007fd7bc7d1000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.net.SocketInputStream.read(SocketInputStream.java:127)
at redis.clients.util.RedisInputStream.fill(RedisInputStream.java:109)
at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:45)
at redis.clients.jedis.Protocol.process(Protocol.java:129)
at redis.clients.jedis.Protocol.read(Protocol.java:200)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:285)
at redis.clients.jedis.Connection.getBinaryBulkReply(Connection.java:204)
at redis.clients.jedis.Connection.getBulkReply(Connection.java:193)
at redis.clients.jedis.Jedis."rpop"(Jedis.java:1133) #你能看到这个玩意嘛
at com.zhcs.bs.bus.task.job.clearRedis.RedisUtils.getDelKeyList(RedisUtils.java:283)
at com.zhcs.bs.bus.task.job.clearRedis.RedisUtils.lambda$clearServerEveryDay$7(RedisUtils.java:325)
4.说明
线程阻塞后,分析对应方法,避免在同一个方法里面,或者同一个循环里面,又读又写,导致线程无期限的io等待
比如:A方法是线程安全的,B方法也是线程安全的,但是你写的C方法里面,同时调用了AB方法,在各种情况下,比如class字节码文件会优化改变你代码顺序,然后多个线程同时去执行AB方法,导致不可预期的结果,因此,为了避免这种问题,应当在操作时,将读与写有意识的分离开来.