一、作用
可以用于对运行中java程序进行诊断监控分析,也可以用于开发阶段查看一些异常信息或者调用过程(如有些第三方代码没有源代码,不便于debug调试)。
注:如果用于对在线运行系统的诊断,需要十分谨慎。
1.脚本编写是否准确无法
2.监测范围是否可控,不能监控过大的范围,给系统带来大的冲击
3.使用btrace工具,会占用一部分内存,如果当前程序内存空间已经不够用了,则不能使用,若强行使用,可能会导致java内存不足而从引起java虚拟机退出
4.通过实际测试,监控不能保证每次都正确监控到结果,而且有时可能会无法正常退出监控。这种方式只能作为定位线上问题的最后一招。
典型应用场景:
1. 监控应用从数据库连接池获取和释放连接(用于发现连接未关闭情况)
2. 监控应用程序所有数据库操作对应的SQL语句
3. 监控指定方法执行耗时
4. 监控线程的启动和终止
5. 监控对象的创建
6. 捕获并打印所有异常信息(对于程序中未在日志中打印出来的信息可以通过这种方式捕获到)
7. 监控多线程环境下,资源的竞争情况,对synchronized修饰的方法及代码块进行监控
8. 检测死锁(当然还有其他方法,如通过jstack pid方式直接获取线程堆栈信息即可查看是否有死锁)
  1. 建立存放btrace的目录,如d:/btrace
  2. 将btrace-bin.zip内容解压到此目录
  3. 在d:/btrace目录下,新建btrace_script目录,用于存放监控脚本(其实监控脚本放在哪里都是可以的)
2)linux安装指导
  1. mkdir btrace
  2. 将btrace-bin.tar.gz上传到此目录
  3. tar -xvf btrace-bin.tar.gz
  4. cd bin
  5. chmod 755 *
  6. 在btrace目录下,mkdir trace_script,用于存放监控脚本

3)运行指导

1.Windows

i.打开命令行窗口,切换至bin目录,执行:btrace.bat pid ../btrace_script/TraceTest.java  (其中pid为要监控的java进程的ID,可以通过jps命令查看正在运行的所有java进程的ID)

ii.退出时按Contrl+c,再按1

2.Linux

i.在bin目录下,执行:./btrace pid ../trace_script/TraceTest.java (其中pid为要监控的java进程的ID,可以通过jps命令查看正在运行的所有java进程的ID)

ii.退出时按Contrl+c,再按1

注:运行命令还可以补充其他的参数,[-I <include-path>] [-p <port>] [-cp <classpath>],详见btrace压缩包中docs/usersguide.html,其中-p参数用于指定btrace监听的端口,默认为2020,如果被其他程序占用了,则必须使用此参数指定其他的可用端口

4)编写监控脚本指导

新建一个普通的java工程,将btrace-bin.zip/build下3个jar包加入编译路径中,然后就可以进行监控脚本开发了。(所谓的监控脚本,也是普通的java程序,只是编译和执行方式不同于普通程序)

四、针对典型场景的监控脚本

1. 监控应用从数据库连接池获取和释放连接(用于发现连接未关闭情况)
2. 监控应用程序所有数据库操作对应的SQL语句

3. 监控指定方法执行耗时

4. 监控线程的启动和终止

5. 监控对象的创建,见Btrace自带样例NewComponent.java
6. 捕获并打印所有异常信息(对于程序中未在日志中打印出来的信息可以通过这种方式捕获到),见Btrace自带样例OnThrow.java
7. 监控多线程环境下,资源的竞争情况,对synchronized修饰的方法及代码块进行监控,见Btrace自带样例AllSync.java
8. 检测死锁,见Btrace自带样例Deadlock.java

五、常用函数说明

1. 判断类型 instanceof

2. 打印当前线程调用栈 BtraceUtils.Threads.jstack()

3. 打印所有线程栈 BtraceUtils.Threads.jstackAll()

4. 连接字符串 BtraceUtils.Strings.strcat

5. 打印BtraceUtils.print/println

6. 获取当前时间BtraceUtils.timestamp("yyyyMMddHHmmss)

7. 整形转字符串 Strings.str()

8. 获取当前线程名 Threads.name(Threads.currentThread()) 

9. 获取java运行环境系统属性 Sys.Env.property 等同于System.getProperty

10. 获取对象类名 Reflective.name(Reflective.classOf(obj)

11. 取对象属性值

   方式1:

函数参数中直接引用参数类

Field field = Reflective.field("cn.jerry.User","name");

print(Reflective.get(field,user);

如果需要访问其他自定义的类,可以通过在执行btrace时增加参数[-cp <classpath>]来指定类访问路径

  方式2:

函数参数中不指定具体参数,使用AnyType[] args,在函数体内使用如下方式获取:

Field field = Reflective.field("cn.jerry.User","name");

print(Reflective.get(field,args[0]);

参考资料:

BTrace简介:http://blog.csdn.net/mgoann/article/details/7268508

原理研究:http://www.iteye.com/topic/1005918

源代码:kenai.com/projects/btrace/sources/hg/show

利用btrace工具监控在线运行java程序的更多相关文章

  1. JAVA设置环境变量和在DOS下运行java程序

    在学校实训的这几天,老师带着我们开始深入的复习java.这是第一天的内容哦 对于“JAVA设置环境变量和在DOS下运行java程序”,许多初学者是陌生的,但了解这个却对后期的学习很重要. http:/ ...

  2. 通过jstack定位在线运行java系统故障_案例1

    问题描述: 在一个在线运行的java web系统中,会定时运行一个FTP上传的任务,结果有一天发现,文件正常生成后却没有上传. 问题初步分析: 1.查看日志文件 发现这个任务只打印了开始进入FTP处理 ...

  3. Java 监控基础 - 使用 JMX 监控和管理 Java 程序

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码网站 已经收录,有很多知识点和系列文章. 此篇文 ...

  4. windows批处理运行java程序

    明确需求 今天你编了一个java swing版照片查看器,想让计算机上的所有照片默认打开方式都改成你的照片查看器. 使用工具软件 很多工具软件都是不把jre打包到exe中的,这就是说打包之后的exe只 ...

  5. Java魔法堂:以Windows服务的形式运行Java程序

    一.前言 由于防止维护人员误操作关闭Java控制台程序,因此决定将其改造为以Windows服务的形式运行.弄了一个上午总算搞定了,下面记录下来,以供日后查阅. 二.Java Service Wrapp ...

  6. 1.配置EditPuls-编译和运行java程序

    1.工具>配置自定义工具 2.添加工具>程序 1).编译java程序 2).运行java程序

  7. java的windows自动化-自动运行java程序

    那么在一些工具齐全并且已经有了一定的写好的java程序的情况下(环境变量和软件见上一章http://www.cnblogs.com/xuezhezlr/p/7718273.html),如何自动化运行j ...

  8. 在云端服务器centos7安装jvm并且运行java程序

    (1)在云端服务器 下载jdk http://www.linuxidc.com/Linux/2016-09/134941.htm(大致看这个文章后可以下载一个jdk的压缩包,然后将压缩包解压) 然后, ...

  9. Jenkins 构建运行java程序

    我们将在Jenkins建立执行一个简单的 HelloWorld 应用程序,构建和运行Java程序.打开网址:http://localhost:8080/jenkins 第1步- 转到Jenkins 仪 ...

随机推荐

  1. 【转】android service 之二(IntentService)

    原文网址:http://rainbow702.iteye.com/blog/1143286 不管是何种Service,它默认都是在应用程序的主线程(亦即UI线程)中运行的.所以,如果你的Service ...

  2. CSS中display:block的使用介绍

    在CSS的规定中,每个页面元素都有一个display的属性,用于确定这个元素的类型是行内元素,还是块级元素: (1)行内元素:元素在一行内水平排列,依附于其他块级元素存在,因此,对行内元素设置高度.宽 ...

  3. 关于bootstrap--表单(水平表单)

    在Bootstrap框架中要实现水平表单效果,必须满足以下两个条件:1.在<form>元素是使用类名“form-horizontal”.2.配合Bootstrap框架的网格系统.(网格布局 ...

  4. swift 自定义导航栏颜色

    func setNavigationApperance(){ //自定义导航栏颜色 [self.navigationController?.navigationBar.barTintColor = U ...

  5. Python字典的操作与使用

    字典的描述 字典是一种key-value的数据类型,使用就像我们上学用的字典,通过拼音(key)来查对应字的详细内容(value). 字典的特性 1.字典是无序的(不像列表一样有下标,它通过key来获 ...

  6. Maven .m2 setting.xml配置

    settings.xml <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="h ...

  7. C#获取文件和文件夹大小

    代码如下: /// <summary> /// 获取文件夹大小 /// </summary> /// <param name="dirPath"> ...

  8. zookeeper应用——集中配置管理系统的实现

    http://blog.csdn.net/huangfengxiao/article/details/8844239

  9. 自定义HttpHandler

    1.创建自定义类型 2.继承IHttpHandler接口,并实现 3.配置Web.Config文件,注册类型 4.访问 public class QuickMsgSatisticsHandler : ...

  10. 关于IE11

    最近,一个开发代号为Windows Blue的Windows操作系统泄漏到了互联网上,该操作系统的内置浏览器为IE11,本文将介绍一下这个泄漏版的IE11中有哪些关键的新变化和新特性. 预先声明: 本 ...