一、作用

可以用于对运行中java程序进行诊断监控分析,也可以用于开发阶段查看一些异常信息或者调用过程(如有些第三方代码没有源代码,不便于debug调试)。

注:如果用于对在线运行系统的诊断,需要十分谨慎。

1.脚本编写是否准确无法

2.监测范围是否可控,不能监控过大的范围,给系统带来大的冲击

3.使用btrace工具,会占用一部分内存,如果当前程序内存空间已经不够用了,则不能使用,若强行使用,可能会导致java内存不足而从引起java虚拟机退出

4.通过实际测试,监控不能保证每次都正确监控到结果,而且有时可能会无法正常退出监控。这种方式只能作为定位线上问题的最后一招。

典型应用场景:

1. 监控应用从数据库连接池获取和释放连接(用于发现连接未关闭情况)

2. 监控应用程序所有数据库操作对应的SQL语句

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

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

5. 监控对象的创建

6. 捕获并打印所有异常信息(对于程序中未在日志中打印出来的信息可以通过这种方式捕获到)

7. 监控多线程环境下,资源的竞争情况,对synchronized修饰的方法及代码块进行监控

8. 检测死锁(当然还有其他方法,如通过jstack pid方式直接获取线程堆栈信息即可查看是否有死锁)

建立存放btrace的目录,如d:/btrace

将btrace-bin.zip内容解压到此目录

在d:/btrace目录下,新建btrace_script目录,用于存放监控脚本(其实监控脚本放在哪里都是可以的)

2)linux安装指导

mkdir btrace

将btrace-bin.tar.gz上传到此目录

tar -xvf btrace-bin.tar.gz

cd bin

chmod 755 *

在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 ] [-p ] [-cp ],详见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 ]来指定类访问路径

方式2:

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

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

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

参考资料:

win10实时监控用java_利用btrace工具监控在线运行java程序相关推荐

  1. ultraedit编译java_在UltraEdit中编译和运行Java程序

    一.首先打开UltraEdit, 点击菜单上的 高级->工具配置,如图: 1 点击插入: 2 在菜单项名称写上该功能,"编译java ": 3 创建一个批处理的文件compi ...

  2. stopwatch java_利用StopWatch类监控Java代码执行时间并分析性能

    springframework中的StopWatch类可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.一般用来测量代码执行所用的时间或者计算性能数据,在优化代码性能上可以使用Sto ...

  3. 运行java程序需要的工具软件的目录,运行Java程序需要的工具软件所在的目录是A.JDK的bin目录B.JDK的demo目录C.JDK的lib目录D.JDKR的j...

    运行Java程序需要的工具软件所在的目录是A.JDK的bin目录B.JDK的demo目录C.JDK的lib目录D.JDKR的j 更多相关问题 [多选] 下列收汇需入待核查账户的是(). [判断题] 教 ...

  4. ultraedit运行java_如何在UltraEdit中编译和运行Java程序

    如何在UltraEdit中编译和运行Java程序 (2011-07-28 12:33:52) 标签: it 问题提出: 可以毫不夸张地说,JDK+UltraEdit是面向Java初学者的开发工具的绝配 ...

  5. 利用终端运行java程序

    利用终端运行JAVA程序 开发Java程序,需要三个步骤:编写程序,编译程序,运行程序 不过首先得配置好你电脑中的Java环境变量,才能执行. 1,首先编写一个程序 打开记事本编写一个文件,就以Hel ...

  6. java反编译工具_如何保护Java程序 才能防止Java反编译

    简介:Java是一种跨平台的.解释型语言.Java 源代码编译中间"字节码"存储于class文件中.Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如 ...

  7. Java 在线编程编译工具上线,直接运行Java代码

    前言 大家好,我是小哈~ 周末没出去浪,花了点时间,在我的个人网站上线了一款小工具.啥工具呢?一款可以在线编译 Java 代码并运行输出结果的小工具. 大家都知道,甲骨文刷 Java 版本号非常积极, ...

  8. 用命令提示符运行java_怎么用命令提示符运行java程序?

    展开全部 编写62616964757a686964616fe59b9ee7ad9431333433646434第一个java程序 建议初学者利用记事本编写,这样可以练习自己的打字速度和自己的理解能力. ...

  9. java第一章,win10 jdk的安装,配置jdk环境,第一个java程序的运行(详细讲解)

    1.jdk的安装 jdk下载地址官网:https://www.oracle.com/java/technologies/javase-downloads.html 来到此页面(如下图所示), 我们还是 ...

最新文章

  1. 【红黑vip提权教程和饭客vip2010***教程全套】
  2. BFC与垂直外边距折叠笔记
  3. Symfony 4.3 发布,带来搜索引擎自动保护
  4. HTML-ViewParse的Controller层插件开发小结
  5. C# 读写ACCESS的OLE对象,演示图片与长文件的读写
  6. 编写下载服务器。 第六部分:描述您发送的内容(内容类型等)
  7. ABP文档翻译--值对象
  8. CVPR 2019 | 腾讯AI Lab 6大前沿方向33篇入选论文解读
  9. Docker整合dockerfly实现UI界面管理(单机版)
  10. 在线获取今天是今年的第周几
  11. python显示图片_python 一个figure上显示多个图像的实例
  12. 分布式爬虫原理之Scrapy分布式实现
  13. java substring 实例_JAVA中截取字符串substring用法
  14. excel熵值法计算权重_熵权法评价估计详细原理讲解
  15. Hive 安全模式下 Prepare Plan 的时间分析
  16. PJzhang:微软出口管制条例
  17. 【汇编程序】实现输出2012-2100年之间所有闰年
  18. Mac下解决硬盘无法读取问题Mounty for NTFS - 免费让 Mac 原生支持移动硬盘/U盘 NTFS 读写的必备驱动应用
  19. 嵌入式软件开发之常用软件(六)
  20. [转]齐善鸿:职业心智训练与管理教育

热门文章

  1. CRC16(modbus)校验计算器的实现
  2. HTTP超文本传输协议----记录
  3. 《红楼梦》门窗墙的分割与比较
  4. talkback 问题解决方案
  5. Java 多线程同时执行
  6. PS快速扩大图片边缘
  7. NNI神经网络调参工具简单学东西笔记,关于参数传递逻辑的学习记录
  8. 智能合约开发以及调用过程的注意事项
  9. 静态的使用---static
  10. raid1重建时间_控制RAID重建时间的最佳方式