再写java探针

news2024/11/18 0:00:09

大家好,我是烤鸭:
    以前写过一篇全链路探针实现的文章,最近同事间搞技术分享,再整理一篇。可惜这两年没有继续搞这方面的技术,算是两年前的拓展篇吧。很多技术只放了图,文字就不写了,可以参考下边的拓展阅读。

文中显示代码的地址:https://gitee.com/fireduck_admin/link-trace-demo

探针的实际使用

最开始接手项目的时候,公司有自己的全链路采集,由于服务端大部分是java项目,所以采集的上报是使用基于拦截的方式(AOP)。

基于拦截其实有比较成功的案例,像pinpoint或者cat。

当时还有基于探针的全链路采集像skywalking,就想着能不能用skywalking的方式(探针)重构下。

重构需要改几百个项目的接入方式,如果没有合适的理由恐怕很难驱动。

于是就想着怎么做一些数据对比,证明探针技术的更有效。

为什么要使用探针技术

其实之前的文章也有写到过,最方便的就是解耦。包含接入和升级都不会有任何的代码侵入,包括java代码或者pom引包。

除此之外呢,我觉得是代码的封闭性。业务不需要关心全链路的采集,甚至看不到任何与之有关的影子,前提是需要做好异常处理和兼容性测试。

当然,数据是少不了的,之前写过一个简略的带数据对比的文章。

https://blog.csdn.net/Angry_Mills/article/details/107868420

归根结底是因为字节码方式不同,性能耗时有区别。

字节码技术介绍

网上有很多的资料可以去看,写的就不那么详细了。

什么是Java字节码,其实就是.class文件。.class文件是由十六进制值组成的,JVM以两个十六进制值为一组,就是以字节为单位进行读取
在这里插入图片描述

在这里插入图片描述
JVM加载字节码的过程:
在这里插入图片描述

加载的过程:以JDK 1.8为例

在这里插入图片描述

双亲委托机制:

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派到父类加载器来完成,每一个层次都是如此,因此最后的加载请求都是传送到最顶层的启动类加载器,只有当父类加载无法加载这个类时(这个类不是自己的加载范围),子加载器才会尝试自己去完成加载。

总结一句话:子类加载器无法加载父类加载器的类。

字节码框架

在这里插入图片描述

用的比较多的几种框架,asm、javasisst、cglib。

asm

官网:https://asm.ow2.io/index.html

idea插件:ASM Bytecode Outline (https://plugins.jetbrains.com/plugin/5918-asm-bytecode-outline)

在这里插入图片描述

javasisit

官网:http://www.javassist.org/、http://www.javassist.org/tutorial/tutorial.html
在这里插入图片描述

不能操作实例变量和实例方法。
在这里插入图片描述

cglib和jdk proxy

官网:https://github.com/cglib/cglib

最常见的面试题,这俩的区别的优劣势。
在这里插入图片描述

以一个实际场景来看,分别用这三个框架对一个类的方法进行增强,记录方法调用的耗时。

代码演示:(asm)
在这里插入图片描述
代码演示:(javassist)

在这里插入图片描述

javaagent 工作原理

JVMTI (jvm interface tool)是 jdk1.2以后加入的,翻译为工具性接口,agentmain和premain,其实就是jvm给开发人员开放了一些api的后门,可以调用一些native的方法。

像我们熟知的idea工具很多地方也是基于探针实现的,启动项目看一下就知道了。

D:\dev\env\jdk\jdk1.8\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:63992,suspend=y,server=n -javaagent:C:\Users\烤鸭的世界\AppData\Local\JetBrains\IntelliJIdea2021.2\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "D:\dev\env\jdk\jdk1.8\jre\lib\xxx.jar" com.maggie.measure.bytecode.javassist.Javassist
JPLISAgent(Java Programming Language Instrumentation Services Agent)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

拓展阅读

class文件官方说明

彻底让你搞懂什么是Java字节码

jvm 加载字节码过程

使用ASM操作Java字节码,实现AOP原理

美团-Java字节码增强探秘

NoClassDefFoundError排查

JPDA学习

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

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

相关文章

笔记本加固态小白怎么设置

​最近有用户说电脑硬盘空间不够用了,于是问笔记本加固态小白怎么设置,打算将系统安装在这上面。但由于原先的系统盘有很多重要的数据,该用户就问到有没有什么办法不需要重装,关于笔记本加固态小白操作方法。 工具/原料&#xff…

Redis集群的三种方式详解(附优缺点及原理区别)

Redis提供了三种集群方式,下面我重点详解Redis三种集群方式的原理及优缺点等区别mikechen 目录 Redis主从复制模式Redis哨兵模式Redis集群模式 Redis主从复制模式 1.Redis主从复制定义 主从模式是三种模式中最简单的,主从模式指的是使用一个Redis实例…

Redis入门及Redis基本数据类型的相关命令

1.1、Redis简介 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker,翻译为: Redis是一个开源的内存中的数据结构存储系统,它可以用作∶数据库、缓存和消息中间件。官网: https:…

2023,AIGC能赚到钱吗?

2022年,AIGC(生成式AI)是当之无愧的网红。AI作画在各大社交平台刷屏,ChatGPT火爆国内外出尽了风头,依靠AI生成语音和表情、动作的数字人也频频露脸。2022年12月,Science杂志发布了2022年度科学十大突破&…

vue-element-template模板

vue-element-template模板 vue-element-admin是一个非常全面的系统,提供了很多现成的方案,我们可以在写项目的时候过来参考,但是也有缺点:不太好进行二次开发,因为要删减的东西太多了。于是就有另外一个子系统vue-elem…

Linux 安装nginx, 搭建nginx文件服务器

在linux安装nginx web 服务器,安装后再修改配置文件,将该主机作为一个文件服务器,最终效果如下图: 安装nginx 安装依赖包 yum install -y gcc pcre-devel zlib-devel openssl openssl-devel (若安装的Redhat7&…

JVM数据结构一览及分析

JVM总体一张图: 整体上来看:类文件从类加载子系统,加载完成之后,主要存放在方法区(JRockit和H9没有方法区,这里指的是HotSpot)。运行时的数据主要是存放在运行时数据区,代码的解释编…

✿✿✿JavaScript --- 常见样式案例

目录 1.下拉框复选框单选框的事件样式 和 禁止喜欢中文字与鼠标右键 2.点击按钮后样式发生变化 3.表格追随鼠标更换颜色 4.点击更换背景 5.点击不同的选择栏,内容展示在一个板块内 6.排他思想,许多按钮,点击谁谁就有样式 7.按钮全选反…

微机原理接口

目录 接口的基本概念 什么是接口?(背会) 接口电路的功能?(背会2019年 ) 接口电路基本结构 什么是端口 (背) 接口的控制原理 数据的传送方式(知道并行串行的特点就可以) 并行传…

校园二手交易WEB

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 方达影院系统总共分两个模块,用户模块和管理员模块, 用户模块:登录和注册功能&#…

【Pytorch_Geometric】(GCN)基本使用:数据集与邻接矩阵格式,图形(点)的可视化展示

声明:仅学习使用~ 目录 过程记录1、Graph Neural Networks2、数据集描述3、edge_index3、模型定义与训练方法4、输出特征展示5、训练模型(半监督,semi-supervised)过程记录 1、Graph Neural Networks 致力于解决不规则数据结构(图像和文本相对格式都固定,但是社交网络与…

陪诊系统app开发,一个应用可切换不同身份

随着人口老龄化,年轻人工作压力大,经常加班,或在外地定居,出差等原因,没时间陪长辈。对于一些有慢性疾病的困扰,需要长期陪伴而延伸出来的一个新型行业-陪诊。陪诊职业出现就被人认可是因为人们对这个职业有…

什么是多模态深度学习?有哪些应用场景?

深度多模态学习能够更全面地理解数据,在准确性和效率上均有大幅提升。但首先,什么是多模态深度学习?它有哪些应用场景?本文将从定义、应用与前景三个角度来回答这两个问题。随着深度神经网络的发展,深度学习也逐渐向多…

基于事件触发的二阶多智能体领导跟随一致性

【无限嚣张(菜菜)】:hello您好,我是菜菜,很高兴您能来访我的博客,我是一名爱好编程学习研究的菜菜,每天分享自己的学习,想法,博客来源与自己的学习项目以及编程中遇到问题…

基于java+springboot的人事招聘信息网站-计算机毕业设计

运行环境 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven 项目介绍 在这个计算…

教你一招,解决头疼的DCOM配置问题

一、背景 OPC通信技术是工业通信领域中一套广为流行的方案,能够帮助大量的使用不同通信协议的下层现场设备数据与上位机应用程序进行交互。实现OPC通信需要基于Winodows上的COM/DCOM技术,只有在服务器和客户端都进行DCOM配置,开放相应的权限…

【矩阵论】6. 范数理论——非负/正矩阵

6.5 非负/正矩阵 6.5.1 定义 a. 非负/正矩阵定义 一个实矩阵 A(aij)∈RmnA(a_{ij})\in R^{m\times n}A(aij​)∈Rmn 若对每一 iii 和 jjj ,aij≥0a_{ij}\ge 0aij​≥0 ,则称A是非负矩阵,A≥0A\ge 0A≥0 若对每一 iii 和 jjj ,…

论文浅尝 | Relational schema optimization for RDF-based KGs

笔记整理:郑国鹏,天津大学硕士链接: https://www.sciencedirect.com/science/article/pii/S0306437921000223动机特征集(CS)根据与其主题节点相关的属性集来组织RDF三元组。它可以捕捉到RDF数据的隐含模式。虽然大多数基于CS的方法…

3、面向对象

文章目录3、面向对象3.1 介绍3.1.1 基本语法3.1.2 案例分析3.2 类和对象3.2.1 类3.2.1 对象3.3 属性3.4 方法3.5 方法参数3.6 传值方式3.7 静态3.8 静态代码块3.9 包3.10 import3.11 构造方法3.12 继承3.13 super、this3.14 继承、构造方法3.15 多态3.16 方法重载3.17 方法重载…

获奖 | APT检测能力再获认可,创宇猎幽荣获“金帽子”年度优秀安全产品奖

近日,2022网络安全金帽子年度评选活动揭晓,创宇猎幽APT流量监测系统获年度优秀安全产品奖。“金帽子”评选推动行业发展创宇猎幽获年度优秀安全产品奖“金帽子”年度评选活动旨在推动网络安全行业的健康发展,让更多的普通大众真正了解和认识网…