Java多线程--使用ThreadMXBean 打出堆栈信息
来源:互联网 发布:淘宝客服沟通技巧简答 编辑:程序博客网 时间:2024/06/06 08:37
我们通常会使用工具jstack 去跟踪线程信息,其如何实现使用attach 的方式还是ptrace 的方式,这些可以去参考本人的博客的其他文章。
但这些方式都是外部使用的方式,如何直接使用Java代码得到当前进程的线程的信息,方便监控jvm的整个运行状态,就不的不提到了ManagementFactory
通过调用方法
ThreadMXBean tmbean = ManagementFactory.getThreadMXBean();
通过得到 ThreadMXBean 可以得到非常多的thread信息,博客里也主要提到几个重要函数的实现
ThreadMXBean是个接口,主要实现都是在 ThreadImpl.java 里实现。
1. getThreadCount()
在虚拟机里会有ThreadService,里面会有些计数器用于记录总线程数,活着线程数目
当线程创建,消亡都会调用 ThreadService 的方法来对计数器加减,这样就能直接得到线程数目的状态,而不需要去遍历线程链表。
2. getAllThreadIds()
这个实现也比较简单,直接扫描线程列表,就可以得到每个java 的线程id, 在扫描过程中使用了锁,锁住了线程链表。 但因为从native代码到java代码中没有锁结构,得到线程的列表只能表示当时的状态,当得到id的时候并不能保证该线程依然存活。
我们也可以看到 JNI attach 的线程,和jvmti agent的线程是不被统计在内的
3. ThreadInfo[] getThreadInfo 得到线程具体的堆栈信息
不论是传入要取的线程列表还是要取的所有的线程列表,最后都会看到将取堆栈信息的任务交给了vm thread 线程处理,关于vm thread的作用可以参考本人的其他博客。
a. vm thread 去遍历所有线程的信息,由于是单线程处理,如果线程数量多的话是会影响到性能的,因为在扫描堆栈过程中,是在softpoint的状态。
b. ThreadDumpResult dump_result(num_threads); 使用ThreadDumpResult 去存储ThreadSnapshot 而保证不会被gc,因为从vm thread抓取线程结束,在填充threadinfo的时候还是会发生gc。
4. 锁的细节显示
在函数 dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers)里有2个参数 lockedMonitor, 和 lockedSynchronizer
而这两个参数分别控制两种锁ThreadInfo .getLockedMonitors() 和 ThreadInfo.getLockedSynchronizers()
a. Monitor 锁
就是我们传统使用的synchronized(Object obj),
可以通过MonitorInfo[]得到具体的锁的数量和信息
b. Locked ownable synchronizers 锁常指的ReentrantLock 和 ReentrantReadWriteLock 锁
通过得到LockInfo[] 可以得到具体的类,锁的数量和信息
- Java多线程--使用ThreadMXBean 打出堆栈信息
- ThreadMXBean 打出堆栈信息原理分析
- java堆栈信息打印
- 查看java堆栈信息
- 获取java堆栈信息
- Java堆栈信息分析
- java堆栈信息丢失
- 查看java堆栈信息
- kill -3无法输出java堆栈信息,使用jstack
- 使用ThreadMXBean类来编程检测死锁
- 多线程中异常堆栈信息展示
- 使用backtrace获取堆栈信息
- 使用 GDB 恢复堆栈信息
- 使用backtrace获取堆栈信息
- 使用backtrace获取堆栈信息
- java 取得异常堆栈信息
- Java 输出 printStackTrace 堆栈信息
- java异常堆栈信息过滤
- RocketMQ的一些特性
- mac配置php7+mysql环境
- 重载-隐藏-覆盖的区别
- 2017年各阶段安卓工程师面临的形势及疑惑解答
- openjudge 宠物小精灵之收服(二维费用背包)
- Java多线程--使用ThreadMXBean 打出堆栈信息
- ubuntu16.04安装交叉编译工具
- 大数据Hive的操作_03_02
- lambda表达式有何用
- Mysql总结-1
- 友元函数与友元类的声明与使用
- php 如何快速判断一个数字属于什么范围
- android 系统下要编写Android.mk来生成相应的库文件已经非常模板化了
- 按钮按下与松开