说来惭愧,那么些年写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使用情况相关推荐

  1. 安卓linux环境 查看进程,查看基于Android 系统单个进程内存、CPU使用情况的几种方法...

    一.利用Android API函数查看 1.1 ActivityManager查看可用内存. ActivityManager.MemoryInfo outInfo = new ActivityMana ...

  2. Linux工作笔记032---Centos7.3 kill杀掉不用的进程_查看某个进程_某个进程占用的cpu,内存情况

    JAVA技术交流QQ群:170933152 $ kill -s 9 1827 其中-s 9 制定了传递给进程的信号是9,即强制.尽快终止进程. linux查看是否有某个运行的进程命令:例如,查询是否包 ...

  3. 查看java项目线程运行情况,以及总线程数

    查看java项目线程运行情况,以及总线程数 观看tomcat线程或者其他java程序线程数量以及运行情况,可以查看 jdk/bin/jvisualvm.exe当前文件是用来监控线程运行信息 有时候系统 ...

  4. java 线程状态 jstack_jstack查看jvm线程状态

    有些时候我们需要查看下jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增 高了.出现了死锁.死循环等,我们该如何分析呢? 由于程序是正常运行的,没有任何的输出,从日志方面也看不出什么问题,所 ...

  5. Java 线程实例一(查看线程是否存活、获取当前线程名称、状态监测、线程优先级设置、死锁及解决方法、获取线程id、线程挂起)

    查看线程是否存活 以下实例演示了如何通过继承 Thread 类并使用 isAlive() 方法来检测一个线程是否存活: public class TwoThreadAlive extends Thre ...

  6. java 查看堆内存_查看java内存情况的几个常用命令

    1.jinfo jinfo:的用处比较简单,就是能输出并修改运行时的java进程的运行参数.用法是jinfo -opt pid 如:查看52606的MaxPerm大小可以用 jinfo -flag M ...

  7. java 查看内存_java 内存查看工具

    业界有很多强大的java profile的工具,比如Jporfiler,yourkit,这些收费的东西我就不想说了,想说的是,其实java自己就提供了很多内存监控的小工具,下面列举的工具只是一小部分, ...

  8. java 分析内存_Java 内存查看与分析

    1:gc日志输出 在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplication ...

  9. Linux查看、运行和杀死java进程

    操作 命令 查看java进程 ps -ef | grep java 不挂断运行命令 nohup java -jar 文件名.jar & 停止特定java进程命令 kill 进程序号 停止所有j ...

最新文章

  1. ndk-build: CreateProcess error=193
  2. ubuntu 16.04 kvm 桥接模式创建虚拟机
  3. apache.camel_在即将发布的Camel 2.21版本中改进了使用Apache Camel和ActiveMQ Artemis处理大型消息的功能...
  4. mongodb聚合操作之group
  5. 【Nginx】磁盘文件写入飞地发
  6. 清华提出:用于细粒度实体分类的Prompt-Learning,并提出可训练Prompt模板
  7. PCIe协议学习之-Ack/Nak协议
  8. 微信聊天小程序——(四、聊天页面)
  9. Golang中defer、return、返回值之间执行顺序的坑
  10. 杂文 - 设计MIUI主题 的 MIUI设计师
  11. 送给梨花仙子国的礼物
  12. 设备台式计算机显示叹号,台式电脑出现叹号不能上网怎么办_台式机电脑出现感叹号不能上网的处理方法-系统城...
  13. JAVA实现经典游戏俄罗斯方块
  14. oracle 判断数字是否连续,oracle中 如何 判断 表中字段是否为 连续的数字,例如‘3333333333',‘44444444’...
  15. 中文字体压缩器并且转换(推荐阅读)
  16. 修改谷歌浏览器缓存位置总结
  17. 学大伟业:如何利用课余时间学习物理竞赛,搞定自主招生?
  18. 「自动控制元件与线路」3 异步电动机及其控制
  19. 【2020 ACM Fellow 华人学者】 任奎 浙江大学
  20. Java面试之——Tomcat

热门文章

  1. 电脑鼠硬件参数及清单
  2. python公里转海里_海里和公里怎么换算?
  3. message提示框的三种显示方式
  4. Python安装库+国内源
  5. 模拟JS触发按钮点击功能
  6. 2011-MVP-OpenDay“聚首云端 智领未来”
  7. juce: 跨平台的C++用户界面库
  8. augustus预测藻类全基因组序列
  9. 2019年华为网络精英挑战赛-服务器
  10. nodejs 处理zip文件的上传