某一天想查看某个应用里的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#编程中,线程池(ThreadPool)是一种高效的线程管理机制,它允许开发者创建并管理多个线程,而无需直接操作线程对象。线程池中的线程可以复用,减少了创建和销毁线程的开销。当我们需要执行大量短生命周期的任务...
线程池管理和多线程上传是并发编程中的一个重要实践,特别是在大数据传输和网络服务中。在Java等编程语言中,线程池通过有效地管理和复用线程资源,避免了频繁创建和销毁线程带来的开销,提升了系统性能。下面将详细...
4. **资源分配与冲突管理**:在使用多线程和线程池时,必须考虑到资源的分配策略以及可能出现的线程冲突问题。例如,需要根据服务器的处理能力来确定合适的线程数量,过多的线程可能会导致CPU调度开销过大。同时,...
本文将深入探讨如何在Winform应用中使用异步多线程和线程池。 一、线程基础 线程是操作系统分配CPU时间的基本单元,每个进程至少包含一个线程。在C#中,可以使用`System.Threading.Thread`类来创建和管理线程。通过...
Java中,我们通常使用`Executors`类提供的静态工厂方法来创建线程池,如`newFixedThreadPool(int nThreads)`创建固定大小的线程池,`newSingleThreadExecutor()`创建只有一个线程的线程池,`newCachedThreadPool()`...
2. 功能性:查看是否有额外的特性,如线程优先级、线程同步机制等。 3. 易用性:评估API的简洁性和易理解程度,以及文档和示例的丰富性。 4. 可扩展性:考虑线程池是否方便添加新功能或与其他组件集成。 5. 社区支持...
使用异步和线程池技术,我们可以将网络请求和数据解析放在后台线程中执行,一旦完成,再通过回调或事件通知到主线程进行UI更新。这样可以确保用户界面始终保持流畅,不会因为网络延迟而卡顿。 例如,Android中,...
1:可以使用类成员函数/全局函数单独的创建一个线程。 2:可以使用类成员函数/全局函数单独的为线程池添加一个任务,可以带多个参数。 3:线程池的线程数量可手动扩展,稍作修改可以修改为自动扩充。 是否下载可前往...
鱼刺线程池 多线程拨号代码。@L1yp。Tags:鱼刺线程池多线程拨号代码。
- **扩展性**:设计线程池时要考虑其可扩展性,以便在未来添加更多功能,如任务优先级队列、线程池的大小限制策略等。 总结来说,线程池是多线程编程中的一个重要概念,通过合理的设计和实现,可以提高程序的并发...
除了`ThreadPoolExecutor`,Java还提供了`Executors`工具类,它提供了一些预设的线程池配置,如`newFixedThreadPool`(固定大小线程池)、`newSingleThreadExecutor`(单线程线程池)等,方便开发者快速创建线程池。...
线程池是一种线程管理技术,它预先创建一定数量的线程,当有任务需要执行时,线程池会从空闲线程中选择一个执行任务,任务完成后,线程返回线程池等待下一次分配。这样可以避免频繁地创建和销毁线程,提高系统性能。...
以下示例显示如何使用线程池。首先创建 ManualResetEvent 对象,此对象使程序能够知道线程池何时运行完所有的工作项。接着,尝试向线程池添加一个线程。如果添加成功,则添加其余的线程(本例中为 4 个)。然后...
同时,后台使用线程池执行多线程下载任务,既保证了用户体验,又确保了数据加载和下载的效率。为了实现这一功能,我们需要: 1. 配置SwipeRefreshLayout,设置刷新监听器,监听onRefresh()事件。 2. 自定义...
- 分析视频文件的大小和复杂性,合理分配任务,防止某个线程负担过重。 - 使用优先级队列,优先处理优先级高的任务,确保关键任务快速完成。 综上所述,线程池多线程视频转码是通过线程池管理多线程,结合FFmpeg...
然而,频繁创建和销毁线程会带来性能开销,因此推荐使用线程池。 **线程池**是C#中的一个系统服务,由`System.Threading.ThreadPool`类提供。线程池管理一组预创建的线程,当有任务需要执行时,它会从池中分配线程...
在IT领域,尤其是在网络编程和高性能服务器开发中,C++线程池和多线程SOCKET服务器框架扮演着至关重要的角色。线程池是一种管理线程的机制,它有效地解决了频繁创建和销毁线程带来的开销,提高了系统资源的利用率。...
1. 查看当前线程池大小: 登录WEBLOGIC控制台,选择服务器-某服务器-监视-性能,可查看到当前最大线程数量。由于WEBLOGIC9取消了在页面进行调整线程大小的功能,需要在后台进行修改。 2. 修改线程池大小 3. 修改...
在C#编程中,线程池(ThreadPool)是一种管理线程资源的有效机制,它能够高效地复用线程,减少创建和销毁线程的开销。线程池中的线程通常用于执行异步任务,因此在某些场景下,我们需要判断线程池中所有的线程是否...
Java的ExecutorService接口及其实现如ThreadPoolExecutor,允许我们自定义线程池参数,如核心线程数、最大线程数、队列大小等。通过线程池,我们可以并发地访问多个数据源,提升数据库操作的并行度,从而提高整体...