目录
2.查看哪些方法调用了 System.gc() ,调用栈是怎样的
1.什么是BTrace
BTrace是sun公司推出的一款Java 动态、安全追踪(监控)工具,可以在不用重启的情况下监控系统运行情况,方便的获取程序运行时的数据信息,如方法参数、返回值、全局变量和堆栈信息等,并且做到最少的侵入,占用最少的系统资源。
2.BTrace使用场景
在生产环境中经常遇到格式各样的问题,如OOM或者莫名其妙的进程死掉。一般情况下是通过修改程序,添加打印日志;然后重新发布程序来完成。
然而,这不仅麻烦,而且带来很多不可控的因素。有没有一种方式,在不修改原有运行程序的情况下获取运行时的数据信息呢?如方法参数、返回值、全局变量、堆栈信息等。
BTrace可以做什么?
BTrace 是一个事后工具,所谓事后工具就是在服务已经上线了,但是发现存在以下问题的时候,可以用 BTrace。
-
比如哪些方法执行太慢,例如监控执行时间超过1s的方法
-
查看哪些方法调用了 System.gc() ,调用栈是怎样的
-
查看方法参数或对象属性
-
哪些方法发生了异常
3.使用限制
为了保证trace语句只读,最小化对被检测程序造成影响, BTrace对trace脚本有一些限制(比如不能改变被trace代码中的状态):
-
不能创建对象
-
不能使用数组
-
不能抛出或捕获异常
-
不能使用循环
-
不能使用synchronized关键字
-
属性和方法必须使用static修饰
需要特别注意的是:不恰当的使用BTrace可能导致JVM崩溃,如在BTrace脚本使用错误的class文件,所以在上生产环境之前,务必在本地充分的验证脚本的正确性。
4.使用方法及样例
4.1使用方法
1.安装和配置
2.btrace $PID $监控脚本
3.BTrace脚本在进程重启后会失效。
注意:需要使用【btracec 监控脚本】命令对监控脚本进行预编译,可以在运行前发现错误。特别是应用到线上环境,必须强制先预编译一下,看是否报错。
4.2使用样例
1.监控方法的耗时
import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; @BTrace public class CheckOnlineStatus{ //监控某一个方法的执行时间 //这里是监控 BtraceServiceImpl 方法中 getCount 的调用情况。duration是以纳秒为单位的,所以换算成ms比较好看一点 ,其他例子也是如此考虑。 @OnMethod(clazz = "com.joson.btrace.service.impl.BtraceServiceImpl",method = "getCount",location=&