本文的目的是学习如何使用BTrace动态跟踪/观察正在运行的Java应用程序(JDK 6+),而无需更改应用程序的代码和配置参数。

什么是BTrace?

BTrace是一个开源项目,始于2007年,最初由A.Sundararajan和K.Balasubramanian两人拥有。 由于Java One 2008会议,它获得了名声。

BTrace帮助我们查明应用程序中的复杂代码问题。 使用BTrace可以解决的问题包括代码错误,不可预测的流程,并发问题和在特定的且通常难以重现的情况下发生的性能问题。

BTrace以程序员定义的方式动态地(无需重新启动应用程序)检测(更改)应用程序的字节码。 工具的目的是查看在代码的特定区域中发生的情况。 如果超出此范围使用,则可能会损害应用程序的流程,因此验证程序禁止该操作。
例如,让我们尝试解决以下问题–重要文件每天偶尔被删除一次。 我们想要找到执行此操作的代码。 因此,我们想更改java.io.File的'delete'方法并在文件名合适的情况下打印调用线程的堆栈跟踪。 使用BTrace,我们可以通过编写简短的Java代码来做到这一点。

以下架构显示BTrace工作原理。

在Tar​​get JVM中,有一个动态插入的BTrace代理(使用attach API )。 BTrace客户端(BTrace命令行或具有BTrace插件的Visual VM)将命令发送到代理并获取响应。 BTrace代理会检测正在加载到目标JVM中的类,并重新加载已经加载的类。

编写跟踪脚本

编写BTrace脚本非常简单明了,其概念类似于面向方面的编程概念。

import com.sun.btrace.annotations.*;
import com.sun.btrace.BTraceUtils;@BTrace
public class HelloWorld {@OnMethod(clazz="java.io.File",method="")
public static void onNewFileCreated(String fileName) {BTraceUtils.println("New file is being created");BTraceUtils.println(fileName);
}

每个BTrace脚本均由探针(Aspects lang语中的切入点)和操作(建议)组成。 探针定义何时应执行检测。 动作定义了检测。
探针可以包括以下内容:

  • 方法进入/退出
  • 电话号码
  • 字段已更新/已访问
  • 方法调用/返回(在指定方法内)
  • 异常抛出(之前)
  • 同步进入/退出
  • 计时器
  • 构造器入口

BTrace的能力和局限性

能力

  • 动态连接到任何Java6 +应用程序并运行any(*)代码

局限性

  • 出于安全考虑,必须与运行跟踪应用程序的用户使用同一用户运行
  • 仅支持Hotspot JVM
  • 与目标应用程序分开编译–不熟悉应用程序类
  • 可能会破坏目标应用程序–我在寿命很长的设置上运行了BTrace,该设置包含很多跟踪脚本。 目标应用程序甚至没有崩溃过。

先进的BTrace

BTrace社区实际上由一个定期在项目上工作的开发人员组成。 因此,不要期望在接下来的版本中有太多的改进和许多新功能。 (这是一个为项目做出贡献的好机会,因为每个开发人员都会显着增强开发水平)。

该项目的文档应该得到显着改进–我发现自己在将这个框架集成到我现有的框架中时曾多次猜测。 BTrace论坛是获取有关框架答案的好方法。

为了理解BTrace的魔力是如何工作的,需要三个领域的知识-“ Java代理开发”,“ java中的字节码操作”和“ Java附加api”。 将来我可能会写一些这些领域。

相关链接

http://www.parleys.com/#st=5&id=1618&sl=1
http://kenai.com/projects/btrace

参考: The Art of Java博客的JCG合作伙伴 Art Gourevitch 对BTrace的介绍 。

翻译自: https://www.javacodegeeks.com/2012/06/introduction-to-btrace-for-java.html

BTrace for Java应用程序简介相关推荐

  1. java btrace_BTrace for Java应用程序简介

    java btrace 本文的目的是学习如何使用BTrace动态跟踪/观察正在运行的Java应用程序(JDK 6+),而无需更改应用程序的代码和配置参数. 什么是BTrace? BTrace是一个开源 ...

  2. 黑马程序员--Java学习01--java简介

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.Java的诞生 Java是1995年6月由 ...

  3. 《Java Web程序设计基础教程》简介

    本书是关于Java Web开发的基础教程,共分15章.第1章介绍如何构建Java Web应用:第2.3章介绍如何解决Java Web应用的输入和输出问题:第4-6章对登录功能进行了3次重构,这也是Ja ...

  4. 双表查询java代码_什么是JDBC?Java数据库连接性简介

    JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...

  5. [Google API](8)构建使用Google API的Java应用程序

    Google 搜索引擎建立起了通过 Web 服务接口可用的索引.拼写建议和缓存页面,从而允许所有语言的程序员都能就个人使用存取信息.Google 搜索引擎还提供了 Java API,从而存取数据更为便 ...

  6. 利用btrace在线监控java程序状态

    2019独角兽企业重金招聘Python工程师标准>>> 利用btrace在线监控java程序状态 btrace介绍 下载地址: https://kenai.com/projects/ ...

  7. java 设计模式_快速上手Java设计模式之简介

    阅读本文约需要5分钟 大家好,我是你们的导师,经常看我朋友圈的同学应该知道,我每天会在微信上给大家免费提供以下服务! 1.长期为你提供最优质的学习资源! 2.给你解决技术问题! 3.每天在朋友圈里分享 ...

  8. java.util.concurrent简介

    文章目录 主要的组件 Executor ExecutorService ScheduledExecutorService Future CountDownLatch CyclicBarrier Sem ...

  9. Java GC系列(1):Java垃圾回收简介

    转载自  Java GC系列(1):Java垃圾回收简介 这篇教程是系列第一部分.首先会解释基本的术语,比如JDK.JVM.JRE和HotSpotVM.接着会介绍JVM结构和Java 堆内存结构.理解 ...

最新文章

  1. Python实现微信防撤回
  2. 杀死进程和apk的安装
  3. Connection reset by peer原理解析
  4. hikari如何切换数据源_hikari数据库连接池
  5. php 文档转html格式文件,php学习笔记之将word文档转化为HTML文件
  6. WP之Sql Server CE数据库
  7. 2021当一名优雅的代码打工人
  8. factorybean 代理类不能按照类型注入_快速理解Spring中的FactoryBean接口
  9. 网上图书商城项目学习笔记-034订单管理
  10. react 打包体积过大_解决 webpack 打包文件体积过大
  11. idea:java注释模板配置
  12. loj507(dp)
  13. 小米手机Root 刷机
  14. 用.NET做动态域名解析
  15. 百果园APP产品迭代
  16. babylonjs 分部加载模型_基于Babylonjs自制WebGL3D模型编辑器
  17. c语言大一课程设计,大一课程设计(C语言).doc
  18. 【电子通识】为什么IC需要自己的去耦电容?
  19. 【行业案例】域乎科技:“数”写长三角一体化的加速度——域乎科技链接未来,做数字时代的奠基人(智慧上海2020总第24篇)
  20. Exynos_4412——IIC总线概述

热门文章

  1. java登录界面命令_Java命令行界面(第19部分):jClap
  2. redis安装_Redis安装
  3. java常见的ide_在三个Java IDE中生成的三种常见方法
  4. Java 8之前和之后的Lambda表达式
  5. 将Spock 1.3测试迁移到Spock 2.0
  6. 应用新的JDK 11字符串方法
  7. 使用Amazon s3托管您的Maven工件
  8. 在JDK 10中不可变与不可修改
  9. 使用精确的Java方法参数
  10. Java性能监控:您应该了解的5个开源工具