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

java btrace

这篇文章是关于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:Java开发人员工具箱中的隐藏宝石,来自我们的JCG合作伙伴 Andrey Redko在Andriy Redko {devmind}博客上。


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

java btrace

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

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

相关文章

xampp浏览php出现乱码,dvwa+xampp搭建显示乱码的问题及解决方案

如图,dvwa显示乱码,解决办法有两个:1、方法一是,临时解决办法,也就是每次都得手动修改:利用浏览器的编码修改2、方法二是:永久方案,那就是修改dvwa的配置文件,修改默认编…

HotSpot的-XshowSettings标志的简单性和价值

一个方便的HotSpot JVM标志 ( 选项为Java启动 java )是-XshowSettings选项。 Oracle Java启动器描述页面中对此选项进行了如下描述 : -XshowSettings : category显示设置并继续。 该选项的可能类别参数包括: all显示所…

Python验证码简单实现(数字和大写字母组成的4位验证码)

#数字和英文大写字母的4位随机数 def checkcode(): #def 定义方法 checkcode() 方法名()import random # 导入包checkcode ""string range(0,4)for i in string:current random.randrange(0,3) #randrange随机数 参数1<随机数<参数2if current ! i:temp …

php haystack,haystack(示例代码)

1、haystack简介Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询&#xff0c;使用全文检索的效率更高 )&#xff0c;该框架支持Solr,Elasticsearch,Whoosh, Xapian&#xff0c;搜索引擎它是一个可插拔的后端(很像Django的数据库层)&#xff0c;所以几乎你…

fopen php 乱码,如何解决php fgets读取文件乱码的问题

如何解决php fgets读取文件乱码的问题,文件,乱码,简体中文,记事本,页面如何解决php fgets读取文件乱码的问题易采站长站&#xff0c;站长之家为您整理了如何解决php fgets读取文件乱码的问题的相关内容。php fgets乱码的解决办法&#xff1a;首先依次点击“菜单修改->页面属…

一致性哈希算法原理分析及实现

一致性哈希算法常用于负载均衡中要求资源被均匀的分布到所有节点上&#xff0c;并且对资源的请求能快速路由到对应的节点上。具体的举两个场景的例子&#xff1a; 1、MemCache集群&#xff0c;要求存储各种数据均匀的存到集群中的各个节点上&#xff0c;访问这些数据时能快速的…

jsf集成spring_JSF – PrimeFaces和Hibernate集成项目

jsf集成spring本文介绍了如何使用JSF&#xff0c;PrimeFaces和Hibernate开发项目。 下面是一个示例应用程序&#xff1a; 二手技术&#xff1a; JDK 1.6.0_21 Maven的3.0.2 JSF 2.0.3 PrimeFaces 2.2.1 Hibernate3.6.7 MySQL Java连接器5.1.17 MySQL 5.5.8 Apache Tomcat 7.…

帝国 loginjs.php,帝国cms 6.6 后台拿shell

时间:2013-02-27来源:源码库 作者:源码库 文章热度:℃漏洞作者&#xff1a; 付弘雪提交时间&#xff1a; 2013-01-21公开时间&#xff1a; 2013-01-21漏洞类型&#xff1a; 文件上传导致任意代码执行简要描述&#xff1a;帝国cms 6.6版本后台拿shell 比网上流行的方法简单很多由…

带有JSF,Servlet和CDI的DynamicReports和JasperReports

在此示例中&#xff0c;我将展示如何将DynamicReport和JasperReports与Servlet和CDI集成。 工具&#xff1a; TIBCO Jaspersoft Studio-6.0.4。最终版 Eclipse Luna服务版本2&#xff08;4.4.2&#xff09;。 WildFly 8.x应用程序服务器。 这是Eclipse上项目层次结构的屏幕…

swing 聊天气泡背景_Java Swing中的聊天气泡

swing 聊天气泡背景本文将向您解释“如何在Java swing应用程序中绘制聊天气泡&#xff1f;” 聊天气泡与呼出或提示气泡相同。 今天&#xff0c;大多数聊天应用程序都以这种格式显示转换&#xff0c;因此本文将帮助您在用Java swing创建的桌面应用程序中执行相同的操作。 以下课…

jdk7与jdk8环境共存与切换

1&#xff0c;先安装jdk7,配置环境变量JAVA_HOME,然后安装jdk8。 2&#xff0c;安装jdk8后&#xff0c;JAVA_HOME指向未做修改&#xff0c;执行java -version显示还是以前的jdk7版本信息&#xff0c; 3&#xff0c;接下来我们配置环境变量JAVA_HOME,发现配置jdk7的路径,或者配置…

PHP培训选云和数据,送给云和数据郑州分中心PHP培训班全体学员的祝福

在云和数据数百个日日夜夜&#xff0c;郑州PHP培训班的学员们一起成长&#xff0c;从青春懵懂到成熟稳重&#xff0c;从羞涩内敛到侃侃而谈&#xff0c;他们用奋斗和拼搏共同刻画了人生中一段难忘的回忆。12月12日&#xff0c;云和数据郑州分中心PHP培训班毕业典礼&#xff0c;…

cyclicbarrier_Java并发– CyclicBarrier示例

cyclicbarrierJava中的CyclicBarrier是JDK 5中在java.util.Concurrent包上引入的同步器&#xff0c;以及其他并发实用程序&#xff0c;例如Counting Semaphore &#xff0c; BlockingQueue &#xff0c; ConcurrentHashMap等。CyclicBarrier与CountDownLatch类似&#xff0c;我…

php队列失败是指什么,队列是什么意思

队列是一种特殊的线性表。它只允许在表的前端(front)进行删除操作&#xff0c;而在表的后端(rear)进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表&#xff1b;进行插入操作的端称为队尾&#xff0c;进行删除操作的端称为队头&#xff1b;队列中没有…

从In Memory Data Grid,Apache Ignite快速入门

IMDG或内存数据网格不是内存中关系数据库&#xff0c;NOSQL数据库或关系数据库。 它是另一种软件数据存储库。 数据模型分布在单个位置或多个位置的许多服务器上。 这种分布称为数据结构。 这种分布式模型被称为“无共享”架构。 IMDG具有以下特征&#xff1a; 所有服务器可以…

91.91p10.space v.php,luogu P1091 合唱队形

任务计划推了很久才做www从两头开始的单调上升队列没啥可说的#include#includeusing namespace std;#define maxn 110int a[maxn];int f[2][maxn];int ans;int main() {int n;scanf("%d",&n);for(int i 1; i < n; i)scanf("%d",&a[i]);a[0] a…

BZOJ 2097 [Usaco2010 Dec]Exercise 奶牛健美操

【题意】 给出一棵树。现在可以在树中删去m条边&#xff0c;使它变成m1棵树。要求最小化树的直径的最大值。 【题解】 二分答案。$Check$的时候用$DP$&#xff0c;记录当前节点每个儿子的直径$v[i]$&#xff0c;如果$v[i]1>mid$&#xff0c;那么就断掉连向儿子的这条边。如果…

daterangepicker双日历插件的使用

今天主要是由于项目的需要&#xff0c;做了一个daterangepicker双日历插件&#xff0c;做出来的效果如下&#xff1a; 个人感觉这个daterangepicker双日历插件很好用&#xff0c;并且实现起来也不是很麻烦&#xff0c;我是根据它的官方文档去写的&#xff0c;并将Bootstrap也整…

php 递归展现城市信息,PHP 递归兑现层级树状展现数据

PHP 递归实现层级树状展现数据?$arr[id],fid > $arr[fid],name > $arr[name],);}// 将数据按照缩进简单排列 见图1function data2arr($tree, $rootId 0, $level 0) {foreach($tree as $leaf) {if($leaf[fid] $rootId) {echo str_repeat( , $level) . $leaf[id] . .…

牛客网 2018年全国多校算法寒假训练营练习比赛(第五场) H.Tree Recovery-完全版线段树(区间更新、区间求和)...

H.Tree Recovery时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K64bit IO Format: %lld链接&#xff1a;https://www.nowcoder.com/acm/contest/77/H来源&#xff1a;牛客网题目描述 You have N integers, A1,…