Btrace使用教程
下载
下载链接:https://github.com/btraceio/btrace/releases/tag/v1.3.9
安装及环境配置
1.下载一个压缩包
2.解压
3.配置环境变量 sudo vi /etc/profile 添加 export BTRACE\_HOME=/home/josonliu/btrace export PATH=$PATH:$BTRACE\_HOME/bin PS:BTRACE\_HOME必须是你解压的路径
4.使配置生效 source /etc/profile 这样就可以在任何地方使用 btrace 命令了
BTrace简介及使用须知
BTrace是一个可以对 JAVA 进行安全、动态追踪的工具。为了保证在追踪动作的只读性,追踪动作不能改变程序的状态。一般来说 BTrace 具体有以下限制(禁令):
1.不准创建新对象!
2.不准创建新数组!
3.不准抛出异常!
4.不准捕捉导常!
5.不准使用断言或静态方法 只准使用 com.sun.btrace.BTraceUtils 中定义的类和方法及脚本里定义的 static 方法。
6.不准对追踪的类或对象进行赋值操作
7.不准使用外部、内部、嵌入或本地类
8.不准实现接口
9.不准使用循环
其实就是一句话 只使用 println\(\) 方法进行打印信息就好 哈哈
使用方法
1.找到要监控的 JVM进程 PID
a.通过 top -c 命令找到
b.通过 ps -ef \| grep 对应进程标识
2.切换到进程拥有账户 一般为 www-data
a.sudo -s 切换到 root 账户
b.btracec 监控脚本 对监控脚本进行预编译 这一点很重要,可以在运行前发现错误。特别是应用到线上环境,必须强制先预编译一下,看是否报错。
c.sudo -u www-data btrace $PID $监控脚本
3.如需修改监控只需要停止运行后 修改脚本 然后运行脚本即可。
4.BTrace脚本在进程重启后会失效。
使用场景
1.查看某一个方法中入参
2.查看某一个方法的响应时间
3.查看某一个方法中所有外部调用的响应时间,方便定位方法响应慢的具体位置及原因
4.查看谁调用了 System.gc(),及其对应的调用栈
实战DEMO
1.监控指定方法的耗时
import com.sun.btrace.annotations.\*;
import static com.sun.btrace.BTraceUtils.\*;
@BTrace
public class CheckOnlineStatus{
//监控某一个方法的执行时间
@OnMethod\(clazz = "com.joson.btrace.service.impl.BtraceServiceImpl",method = "getCount",location=@Location\(Kind.RETURN\)\)
public static void printMethodRunTime\(@ProbeClassName String probeClassName,@Duration long duration\){
println\(probeClassName + ",duration:" + duration / 1000000 + " ms"\);
}
}
这里是监控 BtraceServiceImpl 方法中 getCount 的调用情况。duration是以纳秒为单位的,所以换算成 MS 比较好看一点 ,其他例子也是如此考虑。
2.监控指定函数中所有外部调用的耗时情况.PS:这里最好只监控一个函数 太多的话 性能没法看
import com.sun.btrace.annotations.\*;
import static com.sun.btrace.BTraceUtils.\*;
@BTrace
public class CheckOnlineStatus{
//监控某一个方法的执行时间
@OnMethod\(clazz = "com.joson.btrace.service.impl.BtraceServiceImpl",method = "getCount",
location=@Location\(value=Kind.CALL,clazz="/.\*/",method="/.\*/",where = Where.AFTER\)\)
public static void printMethodRunTime\(@Self Object self,@TargetInstance Object instance,@TargetMethodOrField String methon,@Duration long duration\){
if\( duration > 5000000 \){//如果耗时大于 5 毫秒则打印出来 这个条件建议加 否则打印的调用函数太多 具体数值可以自己调控
println\(methon + ",cost:" + duration / 1000000 + " ms"\);
}
}
}
这里是监控 BtraceServiceImpl 类中 getCount 方法内的外部方法调用情况并打印出响应时间大于 5 MS 的外部调用方法名 。
通过注入 @TargetInstance 和 @TargetMethodOrField 参数,告诉脚本实际匹配到的外部函数调用的类及方法名\(或属性名\)
3.按接口、父类监控方法的执行
import com.sun.btrace.annotations.\*;
import static com.sun.btrace.BTraceUtils.\*;
@BTrace
public class InterfaceMonitor{
//监控某一个方法的执行时间
@OnMethod\(clazz = "+com.joson.btrace.service.BtraceService",method = "getCount",location=@Location\(Kind.RETURN\)\)
public static void printMethodRunTime\(@ProbeClassName String probeClassName,@Duration long duration\){
println\(probeClassName + ",cost time:" + duration / 1000000 + " ms"\);
}
}
这里是监控 BtraceService 接口的所有实现类中 对 getCount 方法的调用情况。
4.正则表达式定位监控
通过正则表达式可以实现批量定位,正则表达式需要写在两个 "/" 中间。PS:建议正则表达式的范围要尽可能的小,不然会非常慢。
import com.sun.btrace.annotations.\*;
import static com.sun.btrace.BTraceUtils.\*;
@BTrace
public class ServiceMonitor{
//监控某一个方法的执行时间
@OnMethod\(clazz = "/com.joson.btrace.service.\*/",method = "/.\*/",location=@Location\(Kind.RETURN\)\)
public static void printMethodRunTime\(@ProbeClassName String probeClassName,@ProbeMethodName String probeMethod,@Duration long duration\){
println\( probeClassName + "." + probeMethod + " cost time: " + duration / 1000000 + " ms."\);
}
}
这里是监控 com.joson.btrace.service 包下的所有类与方法,并打印其调用时间 以 MS 为单位。
通过在函数里注入 @ProbeClassName,@ProbeMethodName 参数,告诉脚本实际匹配到的类和方法名。
5.监控代码是否到达了某类的某一行
import com.sun.btrace.annotations.\*;
import static com.sun.btrace.BTraceUtils.\*;
@OnMethod\(clazz = "java.net.ServerSocket", location = @Location\(value = Kind.LINE, line = 363\)\)
public static void onBind4\(\) {
println\("socket bind reach line:363"\);
}
这里是监控代码是否到达了 Stock类的 363 行。
6.打印某个类中 某一方法的入参
import com.sun.btrace.AnyType;
import com.sun.btrace.annotations.\*;
import static com.sun.btrace.BTraceUtils.\*;
@BTrace
public class ServiceMonitor{
//监控某一个方法的执行时间
@OnMethod\(clazz = "com.joson.btrace.service.BtraceService",method = "getCount",location=@Location\(Kind.RETURN\)\)
public static void printMethodRunTime\(@Self Object self,String type,Integer limit,@Return AnyType result \){
println\( "type: " + type + " ,limit: " + limit \);
println\("result : " + result \);
}
}
这里是监控 BtraceService 类中 getCount 方法的所有入参及返回值
对于入参,不需要打印的也可以不定义 但是定义一定要按顺序。比如参数列表不能放在返回值的后面。
对于返回值类型 如果是非基本类型 则直接用 AnyType 类型即可。
7.查看谁调用了 GC
import com.sun.btrace.annotations.\*;
import static com.sun.btrace.BTraceUtils.\*;
@OnMethod\(clazz = "java.lang.System", method = "gc"\)
public static void onSystemGC\(\) {
println\("entered System.gc\(\)"\);
jstack\(\);// print the stack info.
}
8.其他用法参考链接:https://github.com/btraceio/btrace/tree/master/samples
from: https://json-liu.gitbooks.io/btrace/content/
Btrace使用教程的更多相关文章
- Btrace官方教程-中文版
教程英文版来源:https://github.com/btraceio/btrace/blob/master/docs/usersguide.html BTrace用户指南 BTrace是一种安全,动 ...
- BTrace入门教程
bin版:https://kenai.com/projects/btrace/downloads/directory/releases 源码:https://github.com/btraceio/b ...
- BTrace:线上问题排查工具
BTrace简介 GitHub地址:BTrace 下载地址:v1.3.11.3 官方使用教程:Btrace使用教程 使用场景 BTrace 是一个事后工具,所谓事后工具就是在服务已经上线了,但是发现存 ...
- 利用jvisualvm使用btrace进行线上调试案例
用途:btrace主要用于线上调试.通过btrace,可在不改动代码的前提下,方便的发现以下问题: 1.定位性能慢的接口服务: 2.实时打印堆栈信息,定位死锁位置: 3.定位占用大量内存空间的代码块: ...
- 使用jvisualvm.exe 的Btrace插件介绍/使用教程
一.背景 在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数据信息,我们可以 通过改写代码,增加日志信息的打 ...
- Java应用调试利器——BTrace教程
http://www.jianshu.com/p/26f19095d396 背景 生产环境中可能出现各种问题,但是这些问题又不是程序error导致的,可能是逻辑性错误,这时候需要获取程序运行时的数据信 ...
- btrace 笔记
转载请注明原链接地址 http://www.cnblogs.com/dongxiao-yang/p/6134393.html btrace 是一个可以不用重启线上java业务查问题的神器,记一下自己折 ...
- BTrace使用小结
简介 BTrace是一个安全的JVM动态追踪工具,最初为原Sun公司Kenai项目下面的一个子项目. 典型的使用场景是,“我要查个问题,可那个方法没有打印入口参数和返回结果日志”,“我想看某个方法的执 ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
随机推荐
- Numpy详解
NumPy 简介 Python并没有提供数组功能.虽然列表可以完成基本的数组功能,但它不是真正的数组,而且在数据量比较大时,使用列表的速度会很慢.为此,Numpy提供了真正的数组功能,以及对数据进行快 ...
- OCM_第十五天课程:Section6 —》数据库性能调优 _SQL 访问建议 /SQL 性能分析器/配置基线模板/SQL 执行计划管理/实例限制
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- keras2.0的一些变化
keras 变化太快了https://github.com/fchollet/keras/wiki/Keras-2.0-release-notes
- 洛谷P1099 树网的核
传送门 80分 $ Floyd $ 树的直径可以通过枚举求出.直径的两个端点$ maxi,maxj $ ,由此可知对于一个点 $ k $ ,如果满足 $ d[maxi][k]+d[k][maxj]== ...
- Masm615+notepad++6.8.8搭建汇编开发环境
前言:很早以前搭过,做了笔记的.现在重新玩汇编,按照笔记撘环境,谁知道坑了自己两个小时,气的我现在打字手都在抖 准备工作: 1.Masm615汇编环境,下载地址:https://pan.baidu.c ...
- Javascript中类的实现机制(四)
一: 理解类的实现机制 在JavaScript中可以使用function关键字来定义一个“类”,如何为类添加成员.在函数内通过this指针引用的变量或者方法都会成为类的成员,例如:function ...
- 使用vmware提示无法打开内核设备 \\.\Global\vmx86: 系统找不到指定的文件
问题描述 打开虚拟机时候提示 “vmware没有正常关闭,再次打开使用时蓝屏,在安全模式下再次打开不会蓝屏,但提示“无法打开内核设备 \\.\Global\vmx86: 系统找不到指定的文件,你想要安 ...
- HDU 3980 (SG 环变成链 之前的先手变成后手)
题意 两个人在一个由 n 个玻璃珠组成的一个圆环上玩涂色游戏,游戏的规则是: 1.每人一轮,每轮选择一个长度为 m 的连续的.没有涂过色的玻璃珠串涂色 2.不能涂色的那个人输掉游戏 Aekdycoin ...
- PC_android通信之传输图片并显示在手机端【转】
从服务器 (PC 端 ) 发送图片到客户端 (android 手机端 ) ,并在手机页面上显示该图片.(注:本文旨在实现功能,并未考虑效率,有待后续跟进.) 1.服务器端 int port=9090; ...
- 【UOJ】#49.铀仓库
题解: 会发现实质上运一个点就是两个点之间的距离 暴力是n^2的 考虑二分距离来计算 二分完之后还要二分这个点对应的位置 nlognlogn的 考虑一种常用的思路 用一个点来更新另一个点 首先我们先二 ...