`
wbj0110
  • 浏览: 1610109 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

使用Btrace查看某个线程池活跃线程大小

阅读更多

某一天想查看某个应用里的hsf活跃线程数(工作线程)。

第一个想到的jstack,根据jstack打出的日志分析。

典型日志:

 

Xml代码  收藏代码
  1. "HSFBizProcessor-thread-6"prio=10 tid=0x00002aaabdffd800 nid=0x201f runnable [0x000000004768e000]  
  2.   java.lang.Thread.State: RUNNABLE  
  3.        at java.lang.Class.getEnclosingMethod0(Native Method)  
  4.        at java.lang.Class.getEnclosingMethodInfo(Class.java:929)  
  5.        at java.lang.Class.isLocalOrAnonymousClass(Class.java:1239)  
  6.        at java.lang.Class.isLocalClass(Class.java:1199)  
  7.        atcom.google.gson.AnonymousAndLocalClassExclusionStrategy.isAnonymousOrLocal(AnonymousAndLocalClassExclusionStrategy.java:36)  
  8.        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代码:

 

Java代码  收藏代码
  1. import staticcom.sun.btrace.BTraceUtils.*;  
  2. importcom.sun.btrace.annotations.*;  
  3. importcom.sun.btrace.BTraceUtils;  
  4. importcom.taobao.hsf.rpc.tbremoting.provider.ProviderProcessor;  
  5. importjava.util.concurrent.Executor;  
  6. importjava.util.concurrent.ThreadPoolExecutor;  
  7. importcom.taobao.hsf.domain.HSFRequest;  
  8. @BTrace public classThreadPoolActiveCount {  
  9.   
  10.       //拦截的类和方法  
  11.        @OnMethod(clazz="com.taobao.hsf.rpc.tbremoting.provider.ProviderProcessor",method="handleRequest")  
  12.         static void test(@Self ProviderProcessor instance,HSFRequest hsfRequest) {  
  13.                Executor executor = instance.getExecutor(hsfRequest);  
  14.                println(((ThreadPoolExecutor)executor).getActiveCount());  
  15.        }  
  16. }  

 

 

用jps查看应用pid,执行btrace脚本:

 

Shell代码  收藏代码
  1. 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,会干扰你的脚本~

http://iwinit.iteye.com/blog/1753151

分享到:
评论

相关推荐

    C#线程池 所有线程运行完毕

    在C#编程中,线程池(ThreadPool)是一种高效的线程管理机制,它允许开发者创建并管理多个线程,而无需直接操作线程对象。线程池中的线程可以复用,减少了创建和销毁线程的开销。当我们需要执行大量短生命周期的任务...

    线程池管理多线程上传

    线程池管理和多线程上传是并发编程中的一个重要实践,特别是在大数据传输和网络服务中。在Java等编程语言中,线程池通过有效地管理和复用线程资源,避免了频繁创建和销毁线程带来的开销,提升了系统性能。下面将详细...

    curl线程池多线程调用

    4. **资源分配与冲突管理**:在使用多线程和线程池时,必须考虑到资源的分配策略以及可能出现的线程冲突问题。例如,需要根据服务器的处理能力来确定合适的线程数量,过多的线程可能会导致CPU调度开销过大。同时,...

    C#Winform异步多线程和线程池集成的用法

    本文将深入探讨如何在Winform应用中使用异步多线程和线程池。 一、线程基础 线程是操作系统分配CPU时间的基本单元,每个进程至少包含一个线程。在C#中,可以使用`System.Threading.Thread`类来创建和管理线程。通过...

    线程池管理线程demo

    Java中,我们通常使用`Executors`类提供的静态工厂方法来创建线程池,如`newFixedThreadPool(int nThreads)`创建固定大小的线程池,`newSingleThreadExecutor()`创建只有一个线程的线程池,`newCachedThreadPool()`...

    多线程写法(精易模块线程池和鱼刺模块线程池)

    2. 功能性:查看是否有额外的特性,如线程优先级、线程同步机制等。 3. 易用性:评估API的简洁性和易理解程度,以及文档和示例的丰富性。 4. 可扩展性:考虑线程池是否方便添加新功能或与其他组件集成。 5. 社区支持...

    异步+线程池+线程+加载网络图片

    使用异步和线程池技术,我们可以将网络请求和数据解析放在后台线程中执行,一旦完成,再通过回调或事件通知到主线程进行UI更新。这样可以确保用户界面始终保持流畅,不会因为网络延迟而卡顿。 例如,Android中,...

    C++线程池/线程工具

    1:可以使用类成员函数/全局函数单独的创建一个线程。 2:可以使用类成员函数/全局函数单独的为线程池添加一个任务,可以带多个参数。 3:线程池的线程数量可手动扩展,稍作修改可以修改为自动扩充。 是否下载可前往...

    鱼刺线程池 多线程拨号代码

    鱼刺线程池 多线程拨号代码。@L1yp。Tags:鱼刺线程池多线程拨号代码。

    多线程的使用-一个线程池的Demo

    线程池是一种线程管理机制,它预先创建了一组线程,当需要执行任务时,可以从池中获取空闲线程,而不是每次都创建新的线程,这样可以减少线程创建和销毁的开销。本文将详细讲解线程池的使用,特别是结合UI界面和多...

    线程池c++,通过线程控制实现线程集动态调整线程个数

    - **扩展性**:设计线程池时要考虑其可扩展性,以便在未来添加更多功能,如任务优先级队列、线程池的大小限制策略等。 总结来说,线程池是多线程编程中的一个重要概念,通过合理的设计和实现,可以提高程序的并发...

    bTrace跟踪线程堆栈

    标题 "bTrace跟踪线程堆栈" 涉及到的是在Java开发中对线程堆栈进行监控和分析的技术,主要使用了开源工具bTrace。bTrace是一款强大的、无侵入式的Java运行时代码注入工具,允许开发者在运行中的Java应用上动态添加...

    JAVA使用线程池查询大批量数据

    除了`ThreadPoolExecutor`,Java还提供了`Executors`工具类,它提供了一些预设的线程池配置,如`newFixedThreadPool`(固定大小线程池)、`newSingleThreadExecutor`(单线程线程池)等,方便开发者快速创建线程池。...

    iocp编程 线程池 多线程并发

    线程池是一种线程管理技术,它预先创建一定数量的线程,当有任务需要执行时,线程池会从空闲线程中选择一个执行任务,任务完成后,线程返回线程池等待下一次分配。这样可以避免频繁地创建和销毁线程,提高系统性能。...

    SwipeRefreshLayout下拉刷新+线程池多线程下载+RecyclerView

    同时,后台使用线程池执行多线程下载任务,既保证了用户体验,又确保了数据加载和下载的效率。为了实现这一功能,我们需要: 1. 配置SwipeRefreshLayout,设置刷新监听器,监听onRefresh()事件。 2. 自定义...

    线程池多线程视频转码(完整版)

    - 分析视频文件的大小和复杂性,合理分配任务,防止某个线程负担过重。 - 使用优先级队列,优先处理优先级高的任务,确保关键任务快速完成。 综上所述,线程池多线程视频转码是通过线程池管理多线程,结合FFmpeg...

    如何使用线程池

    以下示例显示如何使用线程池。首先创建 ManualResetEvent 对象,此对象使程序能够知道线程池何时运行完所有的工作项。接着,尝试向线程池添加一个线程。如果添加成功,则添加其余的线程(本例中为 4 个)。然后...

    C# 多线程 线程池 线程同步

    然而,频繁创建和销毁线程会带来性能开销,因此推荐使用线程池。 **线程池**是C#中的一个系统服务,由`System.Threading.ThreadPool`类提供。线程池管理一组预创建的线程,当有任务需要执行时,它会从池中分配线程...

    C++线程池 多线程 SOCEKT服务器框架

    在IT领域,尤其是在网络编程和高性能服务器开发中,C++线程池和多线程SOCKET服务器框架扮演着至关重要的角色。线程池是一种管理线程的机制,它有效地解决了频繁创建和销毁线程带来的开销,提高了系统资源的利用率。...

    qt 线程池实现多线程下载

    通过使用线程池,我们可以有效地避免频繁地创建和销毁线程带来的开销,同时确保系统资源的合理利用。 实现多线程HTTP下载的关键步骤包括: 1. **创建线程任务**:定义一个继承自`QRunnable`的类,用于执行下载任务...

Global site tag (gtag.js) - Google Analytics