java查看线程使用情况,查看java的线程cpu使用情况
说来惭愧,那么些年写java,至今也没碰到需要对jvm内部线程cpu使用情况的研究。
今天碰到一例,因为用了flink,出现了一个处理瓶颈,不得不深入一探究竟。
就Linux的操作系统原理而言,jvm的线程是类似进程的东西,通过top -Hn 14142 可以查看到
14142这个进程内所有线程的cpu使用情况
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND14321 hadoop 20 0 17.7g 8.6g 27756 S 43.2 27.4 8:29.33 java14275 hadoop 20 0 17.7g 8.6g 27756 S 15.9 27.4 2:45.05 java14408 hadoop 20 0 17.7g 8.6g 27756 S 3.7 27.4 0:33.23 java14274 hadoop 20 0 17.7g 8.6g 27756 S 2.3 27.4 0:37.25 java14226 hadoop 20 0 17.7g 8.6g 27756 S 2.0 27.4 0:20.27 java14222 hadoop 20 0 17.7g 8.6g 27756 S 1.3 27.4 0:12.78 java14414 hadoop 20 0 17.7g 8.6g 27756 S 1.3 27.4 0:11.12 java14254 hadoop 20 0 17.7g 8.6g 27756 S 1.0 27.4 0:10.05 java14288 hadoop 20 0 17.7g 8.6g 27756 S 1.0 27.4 0:11.97 java14415 hadoop 20 0 17.7g 8.6g 27756 S 1.0 27.4 0:10.99 java15072 hadoop 20 0 17.7g 8.6g 27756 S 1.0 27.4 0:11.04 java
可以发现,14321 14275 这两个线程使用的cpu最多,那么这两个线程对应的算子是什么呢?这里就需要使用到jstack
jstack 14142 > flink.dump
就可以得到jstack的信息。注意,需要以java进程运行用户的身份来运行上面的命令。
可以得到下面这些东西:
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode):"Attach Listener" #3673 daemon prio=9 os_prio=0 tid=0x00007f76403d6000 nid=0x676d waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"flink-metrics-22" #3672 prio=1 os_prio=0 tid=0x0000000002ef6000 nid=0x674f waiting on condition [0x00007f75bd85d000]java.lang.Thread.State: TIMED_WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x00000004406d94d8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:748)"flink-akka.actor.default-dispatcher-33" #3668 prio=5 os_prio=0 tid=0x00007f765db5f800 nid=0x66d8 waiting on condition [0x00007f75bf67d000]
jstack输出的hex也就是16进制的,所以我们需要把pid再做一下转换。使用python可以调用hex方法.
Python 3.6.8 (default, Aug 7 2019, 17:28:10)[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linuxType "help", "copyright", "credits" or "license" for more information.>>> hex(14321)'0x37f1'>>> hex(14275)'0x37c3'
然后在dump文件中搜索0x37f1,可以得到
"at35__process -> (at35_e -> Sink: at35_sink, at35_current_parameter, at35_current_state) (1/1)" #142 prio=5 os_prio=0 tid=0x00007f7648a78800 nid=0x37f1 in Object.wait() [0x00007f75d53d6000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)at java.lang.Object.wait(Object.java:502)at org.apache.flink.runtime.io.network.partition.consumer.UnionInputGate.waitAndGetNextInputGate(UnionInputGate.java:211)- locked <0x0000000441ab5ae8> (a java.util.ArrayDeque)at org.apache.flink.runtime.io.network.partition.consumer.UnionInputGate.getNextBufferOrEvent(UnionInputGate.java:169)at org.apache.flink.streaming.runtime.io.BarrierBuffer.getNextNonBlocked(BarrierBuffer.java:165)at org.apache.flink.streaming.runtime.io.StreamTwoInputProcessor.processInput(StreamTwoInputProcessor.java:273)at org.apache.flink.streaming.runtime.tasks.TwoInputStreamTask.run(TwoInputStreamTask.java:117)at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:300)at org.apache.flink.runtime.taskmanager.Task.run(Task.java:711)at java.lang.Thread.run(Thread.java:748)
"at20_window -> (at20__message, at20_current_parameter, at20_current_state) (1/1)" #112 prio=5 os_prio=0 tid=0x00007f76485f1800 nid=0x37c3 in Object.wait() [0x00007f75d7af9000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)at java.lang.Object.wait(Object.java:502)at org.apache.flink.runtime.io.network.partition.consumer.UnionInputGate.waitAndGetNextInputGate(UnionInputGate.java:211)- locked <0x0000000441a00cc8> (a java.util.ArrayDeque)at org.apache.flink.runtime.io.network.partition.consumer.UnionInputGate.getNextBufferOrEvent(UnionInputGate.java:169)at org.apache.flink.streaming.runtime.io.BarrierBuffer.getNextNonBlocked(BarrierBuffer.java:165)at org.apache.flink.streaming.runtime.io.StreamTwoInputProcessor.processInput(StreamTwoInputProcessor.java:273)at org.apache.flink.streaming.runtime.tasks.TwoInputStreamTask.run(TwoInputStreamTask.java:117)at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:300)at org.apache.flink.runtime.taskmanager.Task.run(Task.java:711)at java.lang.Thread.run(Thread.java:748)
然后就可以看见线程的名字,就可以去代码里进一步对症下药了。
java查看线程使用情况,查看java的线程cpu使用情况相关推荐
- 安卓linux环境 查看进程,查看基于Android 系统单个进程内存、CPU使用情况的几种方法...
一.利用Android API函数查看 1.1 ActivityManager查看可用内存. ActivityManager.MemoryInfo outInfo = new ActivityMana ...
- Linux工作笔记032---Centos7.3 kill杀掉不用的进程_查看某个进程_某个进程占用的cpu,内存情况
JAVA技术交流QQ群:170933152 $ kill -s 9 1827 其中-s 9 制定了传递给进程的信号是9,即强制.尽快终止进程. linux查看是否有某个运行的进程命令:例如,查询是否包 ...
- 查看java项目线程运行情况,以及总线程数
查看java项目线程运行情况,以及总线程数 观看tomcat线程或者其他java程序线程数量以及运行情况,可以查看 jdk/bin/jvisualvm.exe当前文件是用来监控线程运行信息 有时候系统 ...
- java 线程状态 jstack_jstack查看jvm线程状态
有些时候我们需要查看下jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增 高了.出现了死锁.死循环等,我们该如何分析呢? 由于程序是正常运行的,没有任何的输出,从日志方面也看不出什么问题,所 ...
- Java 线程实例一(查看线程是否存活、获取当前线程名称、状态监测、线程优先级设置、死锁及解决方法、获取线程id、线程挂起)
查看线程是否存活 以下实例演示了如何通过继承 Thread 类并使用 isAlive() 方法来检测一个线程是否存活: public class TwoThreadAlive extends Thre ...
- java 查看堆内存_查看java内存情况的几个常用命令
1.jinfo jinfo:的用处比较简单,就是能输出并修改运行时的java进程的运行参数.用法是jinfo -opt pid 如:查看52606的MaxPerm大小可以用 jinfo -flag M ...
- java 查看内存_java 内存查看工具
业界有很多强大的java profile的工具,比如Jporfiler,yourkit,这些收费的东西我就不想说了,想说的是,其实java自己就提供了很多内存监控的小工具,下面列举的工具只是一小部分, ...
- java 分析内存_Java 内存查看与分析
1:gc日志输出 在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplication ...
- Linux查看、运行和杀死java进程
操作 命令 查看java进程 ps -ef | grep java 不挂断运行命令 nohup java -jar 文件名.jar & 停止特定java进程命令 kill 进程序号 停止所有j ...
最新文章
- ndk-build: CreateProcess error=193
- ubuntu 16.04 kvm 桥接模式创建虚拟机
- apache.camel_在即将发布的Camel 2.21版本中改进了使用Apache Camel和ActiveMQ Artemis处理大型消息的功能...
- mongodb聚合操作之group
- 【Nginx】磁盘文件写入飞地发
- 清华提出:用于细粒度实体分类的Prompt-Learning,并提出可训练Prompt模板
- PCIe协议学习之-Ack/Nak协议
- 微信聊天小程序——(四、聊天页面)
- Golang中defer、return、返回值之间执行顺序的坑
- 杂文 - 设计MIUI主题 的 MIUI设计师
- 送给梨花仙子国的礼物
- 设备台式计算机显示叹号,台式电脑出现叹号不能上网怎么办_台式机电脑出现感叹号不能上网的处理方法-系统城...
- JAVA实现经典游戏俄罗斯方块
- oracle 判断数字是否连续,oracle中 如何 判断 表中字段是否为 连续的数字,例如‘3333333333',‘44444444’...
- 中文字体压缩器并且转换(推荐阅读)
- 修改谷歌浏览器缓存位置总结
- 学大伟业:如何利用课余时间学习物理竞赛,搞定自主招生?
- 「自动控制元件与线路」3 异步电动机及其控制
- 【2020 ACM Fellow 华人学者】 任奎 浙江大学
- Java面试之——Tomcat