BTrace:Java开发人员工具箱中的隐藏宝石

这篇文章是关于BTrace的 ,我正在考虑将其作为Java开发人员的隐藏宝藏。 BTrace是用于Java平台的安全,动态跟踪工具。 BTrace可用于动态跟踪正在运行的Java程序(类似于DTrace,适用于OpenSolaris应用程序和OS)。

不久,该工具允许注入跟踪点,而无需在运行时重新启动或重新配置Java应用程序。 而且,尽管有多种方法可以做到这一点,但我今天要讨论的方法是使用标准JDK捆绑包中的JVisualVM工具。

太酷了, BTrace本身使用Java语言定义注入跟踪点。 如果您曾经进行过面向方面的编程(AOP),则该方法看起来非常熟悉。

因此,让我们开始一个问题:我们有一个使用NoSQL数据库之一(例如,让它成为MongoDB)的应用程序,突然开始出现明显的性能下降。 开发人员怀疑应用程序运行过多的查询或更新,但不能自信地说。 BTrace在这里可以提供帮助。

首先,让我们运行JVisualVM并安装BTrace插件:

JVisualVM应该重新启动以使插件出现。 现在,当我们的应用程序启动并运行时,让我们在JVisualVM应用程序树中右键单击它:

将出现以下非常直观的BTrace编辑器(带有简单的工具栏):

在这里可以定义跟踪工具并将其动态注入正在运行的应用程序中。 BTrace有一个非常丰富的模型来定义应该精确跟踪的内容:方法,构造函数,方法返回,错误等。 它还支持开箱即用的聚合,因此在应用程序运行时很容易收集大量指标。 对于我们的问题,我们想查看与MongoDB相关的哪些方法正在执行。

当我的应用程序使用Spring Data MongoDB时 ,我对应用程序正在调用org.springframework.data.mongodb.core.MongoOperations接口的任何实现的方法以及每次调用需要多长时间感兴趣。 所以我定义了一个非常简单的BTrace脚本:

import com.sun.btrace.*;
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;@BTrace
public class TracingScript {@TLS private static String method;@OnMethod(clazz = '+org.springframework.data.mongodb.core.MongoOperations', method = '/.*/')public static void onMongo( @ProbeClassName String className, @ProbeMethodName String probeMethod, AnyType[] args ) {method = strcat( strcat( className, '::' ), probeMethod );}@OnMethod(clazz = '+org.springframework.data.mongodb.core.MongoOperations', method = '/.*/', location = @Location( Kind.RETURN ) )public static void onMongoReturn( @Duration long duration ) {println( strcat( strcat( strcat( strcat( 'Method ', method ), ' executed in ' ), str( duration / 1000 ) ), 'ms' ) );}
}

让我简要解释一下我在做什么。 基本上,我想知道何时调用org.springframework.data.mongodb.core.MongoOperations的任何实现的任何方法( onMongo标记)和调用持续时间( onMongoReturn依次标记)。 线程局部变量方法保存完整的合格方法名称(带有类),而由于使用了有用的BTrace预定义注释, duration参数保存了方法执行时间(以纳秒为单位)。 尽管它是纯Java,但BTrace仅允许使用Java类的一小部分。 这不是问题,因为com.sun.btrace.BTraceUtils类提供了许多有用的方法(fe, strcat )来填补空白。 运行此脚本将产生以下输出:

** Compiling the BTrace script ...
*** Compiled
** Instrumenting 1 classes ...
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 25ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 3ms
Method org.springframework.data.mongodb.core.MongoTemplate::getDb executed in 22ms
Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 19ms
Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 1ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 3ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::getDb executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 1ms
Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 6ms
Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 1ms
Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 0ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 1ms
Method org.springframework.data.mongodb.core.MongoTemplate::getDb executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 1ms
Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 6ms
Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 1ms
Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 0ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 1ms
...

如您所见,输出包含一堆内部类,可以通过提供更精确的方法名称模板(或者甚至可以跟踪MongoDB驱动程序)来消除它们。

我才刚刚开始发现BTrace,但是使用该功能强大的工具对开发人员来说, 无疑是很有价值的。

参考: BTrace:我们的JCG合作伙伴 Andrey Redko在Andriy Redko {devmind}博客上的Java开发人员工具箱中的隐藏宝石 。


翻译自: https://www.javacodegeeks.com/2012/08/btrace-hidden-gem-in-java-developer.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 图片转视频ffmpeg_python图片转视频(opencv),ffmpeg压缩视频

要注意:1. 图片传视频要自己设置帧率和分辨率2.读取图片后分辨率要resize为和视频分辨率一样才可以3.写完.avi视频后视频比较大,用ffmpeg将avi视频压缩为mp4import cv2from cv2 import VideoWriter, VideoWriter_fourcc, imread, resizeimport osfrom su…

门面模式

门面模式的定义 门面模式(Facade Pattern)也叫做外观模式,是一种比较常用的封装模式,其定义如 下: Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface tha…

Mysql数据库申请

前段时间大部门下新成立了一个推广百度OCR、文字识别、图像识别等科技能力在金融领域应用的子部门。因为部门刚成立,基础设施和人力都是欠缺的。当时分到我们部门的任务是抽调一个人做新部门主站前端开发工作。本来说的是只负责页面的开发工作。当我参加过需求品审会…

Spring–添加SpringMVC –第2部分

在上一部分中,我们为经理和员工实现了控制器。 既然我们知道了解决方法,我们将做很少(但仅做很少)更复杂的事情–任务和时间表的控制器。 因此,让我们从org.timesheet.web开始。 TaskController 。 首先创建一个类&…

php 正则分隔_探讨PHP函数split()如何使用正则表达式切割字符串

对于初学者来说,掌握PHP中常用函数的用法,是其继续学习的基础。今天我们就为大家详细介绍有关PHP函数split()的一些使用方法,希望大家能通过这篇文章介绍的内容增加自己的知识库。说明array split ( string $pattern, string $string [, int …

通用的ProtostuffSerializer for Java

以前使用 protobuf或protostuff的时候觉得很麻烦,每个类都要单独定制,于是封装了一个类。 同事测试过,性能和压缩率都很好,尤其是相比json的序列化。 需注意:只支持Pojo类(即需要有get/set方法)…

SAS笔记(6) PROC MEANS和PROC FREQ

PROC MEANS和PRC FREQ在做描述性分析的时候很常用,用法也比较简单,不过这两个过程步的某些选项容易忘记,本文就梳理一下。 在进入正文前,我们先创建所需的数据集TEST_SCORES: DATA TEST_SCORES; INPUT COUNTY : $9. SC…

休眠:保存vs持久并保存或更新

save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题,就像Hibernate中get和load方法之间的区别一样。 Hibernate Session类提供了几种通过save , saveOrUpdate和persist等方法将对象保存到数据库中的方法。…

php搜索数据库设计,PHP数据库搜索功能设计

其实搜索功能的设计很简单,几行代码就可以完成。下面是form表单。从表单发出的数据名为search,然后发送到../admin/article_SearchResult.php这个文件处理。下面讲下article_SearchResult.php这个文件如何实现搜索。$searchs $_POST[‘search‘];?>…

2016 Android Top 10 Library

过去的 2016 年,开源社区异常活跃,很多个人与公司争相开源自己的项目,让人眼花缭乱,然而有些项目只是昙花一现,有些项目却持久创造价值,为开发者提供了极大的便利,这些终究由时间来判断。今天&a…

集成JavaFX和Swing

我刚刚完成了对使用Swing的应用程序组件的重写,现在正在使用JavaFX,最后得到了与更大的swing应用程序集成的JavaFX组件。 这是一个很大的应用程序,重写花了我一段时间,最后一切都很好,我很高兴自己做到了。 您可能想在…

提示错误:“应为“providerInvariantName”参数的非空字符串。”

我在调试Petapoco的T4模版的时候&#xff0c;链接一直报如题那个错误。在定性问题为配置文件后找的原因如下&#xff1a; <connectionStrings><add name"这个不行" connectionString"Data Sourcexxx;Initial Catalog数据库名;User ID帐号;Password密码…

php oop面试题,PHP面试题 - 对面向对象的理解

具体的题目应该是&#xff1a;什么是面向对象&#xff1f;主要的特征是什么&#xff1f;当然还有很多类似的题目&#xff0c;如果你说一下你对面向对象的理解&#xff0c;或者是你对比一下面向过程等等&#xff0c;诸如此类吧&#xff1f;如果我来回答这个问题&#xff0c;我会…

NOIP2014自测(晚自习两节+上午两节 共5个小时)

昨天刚刚考完试然后就翘晚自习跟今天上午两节课的语文和英语做做noip2014的题目。然后去评测了一番。首先day1day2的t1基本都是模拟&#xff0c;一看就出思路那种&#xff0c;直接ac掉。代码如下 day1t1&#xff1a;#include<iostream>#define maxn 209using namespace s…

您在eXo平台上的第一个Juzu Portlet

菊珠是佛教的佛珠。 一句话&#xff0c;我相信您已经学到了什么&#xff0c;印象深刻吗&#xff1f; 好的&#xff0c;我在这里不谈论佛教。 Juzu还是一个用于快速开发Portlet&#xff08;以及即将推出的独立应用程序&#xff09;的新框架。 您可以在Juzu网站上找到所需的所有…

Spring注入方式及注解配置

一&#xff1a;基于xml的DI&#xff08;Dependency Injection&#xff09; 注入类型&#xff1a; 定义学生Student实体类和小汽车Car实体类&#xff1a;进行封装和生成ToString(),并自定义属性Car Student 123456789101112131415161718192021222324252627282930313233343536373…

java 切面 不执行,解决springboot的aop切面不起作用问题(失效的排查)

检查下springboot的启动类是否开启扫描springbootapplicationcomponentscan(basepackages {"com.zhangpu.springboot"})另外springboot默认开启的enableaspectjautoproxy为true如果不放心可以增加&#xff1a;enableaspectjautoproxy(proxytargetclasstrue)第二种可…

修改readonly属性的值

一般情况下&#xff0c;readonly属性的值是无法修改的&#xff0c;但可以通过特殊方式修改。定义一个student的类&#xff0c;其中name属性为readonly类型的变量 interface JFStudent : NSObjectproperty(nonatomic,copy,readonly) NSString *hisName;property(nonatomic,copy)…

VisualVM:通过SSH监视远程JVM(是否为JMX)

VisualVM是用于监视JVM&#xff08;5.0&#xff09;的有关内存使用情况&#xff0c;线程&#xff0c;GC&#xff0c;MBeans等的出色工具。让我们看看如何通过SSH使用它来监视&#xff08;甚至使用JMX对其进行采样&#xff0c;对带有JMX的远程JVM进行监视&#xff09;它。 这篇文…

h5 php js实验总结,H5学习_番外篇_PHP数据库操作

1. 文件操作1.1 打开关闭文件fopen()resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] )?fopen()函数将resource绑定到一个流或句柄。绑定之后&#xff0c;脚本就可以通过句柄与此资源交互;例1:以只读方式打开一个位于本地服务…