首页 > 其他分享 >使用Btrace查看某个线程池活跃线程大小

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

时间:2023-05-06 14:32:14浏览次数:40  
标签:lang java btrace 线程 某个 hsf Btrace Class


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

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

典型日志:

 



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



    1. "HSFBizProcessor-thread-6"prio=10 tid=0x00002aaabdffd800 nid=0x201f
    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

    先看下hsf代码,发现核心处理代码是ProviderProcessor. handleRequest这个方法(用jstack也可以看出)。每个worker线程都会调用一次。又发现ProviderProcessor. getExecutor这个方法可以拿到当前的线程池,调用对应方法即输出当前活跃线程数。

    开发对应btrace脚本java代码:

     



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


    1. import
    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
    9.   
    10. //拦截的类和方法
    11. @OnMethod(clazz="com.taobao.hsf.rpc.tbremoting.provider.ProviderProcessor",method="handleRequest")  
    12. static void test(@Self
    13.                Executor executor = instance.getExecutor(hsfRequest);  
    14.                println(((ThreadPoolExecutor)executor).getActiveCount());  
    15.        }  
    16. }


     

     

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

     



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


    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包位置非常方便

    3.      小心目标jvm也启动一个btrace agent,会干扰你的脚本~

    标签:lang,java,btrace,线程,某个,hsf,Btrace,Class
    From: https://blog.51cto.com/u_2650279/6249707

    相关文章

    • Python多线程爬虫简单模板
      多线程爬虫的流程可以大致分为:(1)获取种子URL:从初始URL中抓取起始页面,解析其中的URL,并将这些URL添加到未访问的URL队列中;(2)解析下载的网页:从URL队列中取出一个URL,下载其内容,解析其中的链接,并把新的链接放入未访问的URL队列中;(3)存储爬取的数据:从URL队列中取出未访问的URL,把其中的内......
    • Java中快如闪电的线程间通讯
      这个故事源自一个很简单的想法:创建一个对开发人员友好的、简单轻量的线程间通讯框架,完全不用锁、同步器、信号量、等待和通知,在Java里开发一个轻量、无锁的线程内通讯框架;并且也没有队列、消息、事件或任何其他并发专用的术语或工具。只用普通的老式Java接口实现POJO的通讯。它可能......
    • Java并发(四)----线程运行原理
      1、线程运行原理1.1栈与栈帧  JavaVirtualMachineStacks(Java虚拟机栈JVM)我们都知道JVM中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存......
    • C++中的多线程编程和同步机制
      C++中的多线程编程和同步机制使得程序员可以利用计算机的多核心来提高程序的运行效率和性能。本文将介绍多线程编程和同步机制的基本概念和使用方法。多线程编程基础在C++中,使用<thread>库来创建和管理线程。线程可以通过函数、成员函数或者Lambda表达式来实现。以下是一个使......
    • 连接池/线程池
      线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有......
    • javaNIO多线程worker实现
      boss线程负责接收连接,worker线程负责处理IO事件。packagenet.yury.nio;importjava.io.IOException;importjava.net.InetSocketAddress;importjava.nio.ByteBuffer;importjava.nio.channels.*;importjava.nio.charset.StandardCharsets;importjava.util.ArrayList;......
    • C++ - VS2019配置pthread线程库
      说明在VS里用MS编译器不能直接调用pthread库,需要先自行下载该库:http://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip解压后用的到的只有Pre-built.2文件夹下的文件。 配置如下图分别配置三大项:包含目录-->...pthreads-w32-2-9-1-release\Pre-built.......
    • 模板方法中的线程安全问题
      1、线程安全?是否存在临界区,共享的变量,会被不同线程写入那么模板方法里面基类的成员变量或者方法就会存在线程安全问题2、excel  AbstractExcelSheet业务数据和excel逻辑解耦让data可以在service层之间set进来这样excel的相关类不用添加到spring容器中 pub......
    • C语言多线程
      线程按照其调度者可以分为用户级线程和核心级线程两种 用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持; 我们常用基本就是用户级线程,所以就只总结一下POSIX提供的用户级线程接口; 基本线程操作相关的函数: 1......
    • 探究Spring中Bean的线程安全性问题
      前言  今天同事笑嘻嘻的凑过来,问了我一个问题:spring中的bean是线程安全的吗?。我内心一想肯定是安全的,毕竟这样多项目在用。但是转念一想,他那贱兮兮的表情,多半是在给我挖坑。于是我自信的回答他:不安全。他反问,你确定......