某一天想查看某个应用里的hsf活跃线程数(工作线程)。
第一个想到的jstack,根据jstack打出的日志分析。
典型日志:
"HSFBizProcessor-thread-6"prio=10 tid=0x00002aaabdffd800 nid=0x201f runnable [0x000000004768e000]
java.lang.Thread.State: RUNNABLE
at java.lang.Class.getEnclosingMethod0(Native Method)
at java.lang.Class.getEnclosingMethodInfo(Class.java:929)
at java.lang.Class.isLocalOrAnonymousClass(Class.java:1239)
at java.lang.Class.isLocalClass(Class.java:1199)
atcom.google.gson.AnonymousAndLocalClassExclusionStrategy.isAnonymousOrLocal(AnonymousAndLocalClassExclusionStrategy.java:36)
atcom.google.gson.AnonymousAndLocalClassExclusionStrategy.shouldSkipClass(AnonymousAndLocalClassExclusionStrategy.java:32)
注意排除掉java.lang.Thread.State: WAITING (parking)的还没有领取task的线程即可。
每次打日志也比较麻烦,这个时候我只能祭出神器btrace了,一个运行期诊断工具,下载安装和user_guide见http://kenai.com/projects/btrace/pages/UserGuide或者参见毕玄大神的文章http://rdc.taobao.com/team/jm/archives/509。
先看下hsf代码,发现核心处理代码是ProviderProcessor. handleRequest这个方法(用jstack也可以看出)。每个worker线程都会调用一次。又发现ProviderProcessor. getExecutor这个方法可以拿到当前的线程池,调用对应方法即输出当前活跃线程数。
开发对应btrace脚本java代码:
import staticcom.sun.btrace.BTraceUtils.*;
importcom.sun.btrace.annotations.*;
importcom.sun.btrace.BTraceUtils;
importcom.taobao.hsf.rpc.tbremoting.provider.ProviderProcessor;
importjava.util.concurrent.Executor;
importjava.util.concurrent.ThreadPoolExecutor;
importcom.taobao.hsf.domain.HSFRequest;
@BTrace public classThreadPoolActiveCount {
//拦截的类和方法
@OnMethod(clazz="com.taobao.hsf.rpc.tbremoting.provider.ProviderProcessor",method="handleRequest")
static void test(@Self ProviderProcessor instance,HSFRequest hsfRequest) {
Executor executor = instance.getExecutor(hsfRequest);
println(((ThreadPoolExecutor)executor).getActiveCount());
}
}
用jps查看应用pid,执行btrace脚本:
sudo -u admin/home/xxxxxx/btrace/bin/btrace -cp/home/admin/...../hsf.service.rpc.tbremoting-1.4.9.jar.plugin:/home/admin/..../hsf.services-1.4.9.jar.plugin5666 /home/xxxxxx/btrace/samples/ThreadPoolActiveCount.java >result
注意classpath设置,btrace脚本里依赖的类必须要import哦。
执行结果:
3
3
2
2
1
1
1
1
0
0
0
……
因为不安全模式下的btrace风险比较大,一定要清楚自己的代码有没危险,才能用,不然就是故障了。。。
注意点:
1. 默认为了安全btrace只能调用BtraceUtils里的方法,此时需要修改bin/btrace里的-Dcom.sun.btrace.unsafe=fasle 将false改为true即可在btrace脚本里执行任意代码。。。
2. 使用housemd的loaded指令查找jar包位置非常方便,手册https://github.com/zhongl/HouseMD,又一神器啊
3. 小心目标jvm也启动一个btrace agent,会干扰你的脚本~
分享到:
相关推荐
C#线程池 所有线程运行完毕,只是测试代码,用来弄清楚,打印信息很明确,适合初学者
使用线程池管理多线程上传,包含了文件拆分,文件分片多线程上传,单文件上传。多线程执行任务等待管理。拒绝直接new Thread创建新线程导致的诸多问题
史上最强多线程面试44题和答案:线程锁+线程池+线程同步等
线程池管理线程demo,可以参考下。比较详细。将线程任务托管给线程池,减少开销。
1:可以使用类成员函数/全局函数单独的创建一个线程。 2:可以使用类成员函数/全局函数单独的为线程池添加一个任务,可以带多个参数。 3:线程池的线程数量可手动扩展,稍作修改可以修改为自动扩充。 是否下载可前往...
鱼刺线程池 多线程拨号代码。@L1yp。Tags:鱼刺线程池多线程拨号代码。
本程序详细介绍了线程和线程池的用法,使用多线程进行和异步编程实现数据库操作和日志的记录
异步+线程池+线程+加载网络图片.zip
C++线程池 多线程 SOCEKT服务器框架 多线程,线程池技术,事件选择模型,满足基本的游戏服务器需求
(2) 多线程。单个线程下载速度毕竟有限,使用多线程去调用接口。实现高并发高性能,需要考虑资源分配和冲突的问题。
线程,线程池和线程间同步的例子,vs2008环境的完整方案,虽然简单,但对于理解线程的用法还是很有用的。
C# 多线程 线程池 线程同步 单线程 线程的开始、挂起、恢复、结束、同步和异步
以下示例显示如何使用线程池。首先创建 ManualResetEvent 对象,此对象使程序能够知道线程池何时运行完所有的工作项。接着,尝试向线程池添加一个线程。如果添加成功,则添加其余的线程(本例中为 4 个)。然后...
1. 查看当前线程池大小: 登录WEBLOGIC控制台,选择服务器-某服务器-监视-性能,可查看到当前最大线程数量。由于WEBLOGIC9取消了在页面进行调整线程大小的功能,需要在后台进行修改。 2. 修改线程池大小 3. 修改...
保证线程安全的Qt线程池使用,线程任务可以和其他线程通信,使用场景:频繁操作的I/O操作或是耗时操作。
JAVA使用线程池查询大批量数据
线程池的多线程并发控制技术研究.caj 线程池的多线程并发控制技术研究.caj 线程池的多线程并发控制技术研究.caj
通过对SwipeRefreshLayout下拉刷新+线程池多线程下载+RecyclerView的整合实现下拉刷新,支持listview上拉加载,项目和灵活,可以根据自己需求进行改动
线程池是一个容纳多个线程的容器,线程池中的线程可以重复使用,无需反复创建线程而消耗过多的资源 * 使用多线程的好处: 1.降低消耗,减少了创建和销毁线程的次数,每个线程都可以重复利用,可执行多个任务 2.提高...
1、为什么需要使用线程池 1.1 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率。 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3,如果T1+T3>T2,那说明开启一个...