偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一篇文章解密 Arthas 實(shí)現(xiàn)原理

開發(fā) 前端
今天我們就來對 Arthash 的實(shí)現(xiàn)進(jìn)行解密。提前透露下今天重要的角色:Instrument、ASM。

前言

在之前文章中介紹了 Arthas 應(yīng)用診斷利器--入門和常用騷操作,想必大家同我一樣對 Arthas 這么強(qiáng)大的功能所折服(如何做到無需重啟 attach 到 JVM、又如何實(shí)現(xiàn)各種監(jiān)聽和統(tǒng)計(jì)等功能),今天我們就來對 Arthash 的實(shí)現(xiàn)進(jìn)行解密。提前透露下今天重要的角色:Instrument、ASM。

Instrument

帶著問題 Arthas 如何做到無需重啟 attach 到 JVM 開始進(jìn)入正題,首先先介紹下 Instrument。

Instrumentation類提供控制Java語言程序代碼的服務(wù)。Instrumentation可以實(shí)現(xiàn)在方法插入額外的字節(jié)碼從而達(dá)到收集使用中的數(shù)據(jù)到指定工具的目的。由于插入的字節(jié)碼是附加的,這些更變不會修改原來程序的狀態(tài)或者行為。通過這種方式實(shí)現(xiàn)的良性工具包括監(jiān)控代理、分析器、覆蓋分析程序和事件日志記錄程序等等。

簡單來說,Instrument 就是「針對已有的類修改其字節(jié)碼來增強(qiáng)其邏輯,從開發(fā)者的角度可以理解為 JVM 層面的 AOP 編程」。開源的很多 APM(Application Performance Monitor) 框架如 SkyWalking、PinPoint 等都是通過java.lang.instrument包提供的字節(jié)碼增強(qiáng)功能來實(shí)現(xiàn)的,大部分情況下 我們都是使用 Instrument 字節(jié)碼插樁的功能。

  1. Jdk5 開始引入 java.lang.instrument 包,一開始只有 premain 的方式(通過命令行使用外部代理jar包 )
  2. 新建/在現(xiàn)有的項(xiàng)目中,編寫 premain 函數(shù) public static void premain(String agentArgs, Instrumentation inst)。
  3. 將項(xiàng)目打成 jar 包,并引入 Maven 插件 maven-jar-plugin 指定 Premain-Class。

通過指定Agent運(yùn)行 java -javaagent:代理Jar包的路徑 [=傳入premain的參數(shù)] yourTarget.jar

Jdk6 之后針對這點(diǎn)進(jìn)行優(yōu)化,不再需要在通過命令 -javaagent 的方式指定引入代理 Jar,而是通過使用 agentmain 在運(yùn)行時通過attach工具激活指定代理。就可以通過 addTransformer,retransformClasses,redefineClasses等方式對字節(jié)碼進(jìn)行增強(qiáng)和熱替換了。

  1. 新建/在現(xiàn)有的項(xiàng)目中,編寫 agentmain 函數(shù) public static void agentmain(String agentArgs, Instrumentation inst)。
  2. 將項(xiàng)目打成 jar 包,并引入 Maven 插件 maven-jar-plugin 指定 Premain-Class。
  3. 通過attach工具直接加載Agent。

「簡單的提下 Instrument原理:」

instrument 的底層實(shí)現(xiàn)依賴于 JVMTI(JVM Tool Interface),它是JVM暴露出來的一些供用戶擴(kuò)展的接口集合,JVMTI是基于事件驅(qū)動的, JVM 每執(zhí)行到一定的邏輯就會調(diào)用一些事件的回調(diào)接口(如果有的話),這些接口可以供開發(fā)者去擴(kuò)展自己的邏輯。JVMTIAgent 是一個利用 JVMTI 暴露出來的接口提供了代理啟動時加載(agent on load)、代理通過 attach 形式加載(agent on attach)和代理卸載(agent on unload)功能的動態(tài)庫。而instrument agent可以理解為一類 JVMTIAgent 動態(tài)庫,別名是 JPLISAgent(Java Programming Language Instrumentation Services Agent),也就是專門為java語言編寫的插樁服務(wù)提供支持的代理。

ASM

既然已經(jīng)有了重寫類的入口(Instrument),那么只需要結(jié)合第三方的字節(jié)碼編譯工具即可完成想要的功能了,Arthas 就是通過 ASM 用來動態(tài)生成class或者增強(qiáng)class,比如常用的 Gradle 在運(yùn)行時基于 ASM 運(yùn)行時生成一些類、 CGLib 也是基于 ASM 實(shí)現(xiàn)的(插一個題外話:Jdk Proxy而是基于是「反射機(jī)制」實(shí)現(xiàn)的)

「ASM」是一個通用的 Java 字節(jié)碼操作和分析框架。它可用于直接以二進(jìn)制形式修改現(xiàn)有類或動態(tài)生成類。ASM 提供了一些常見的字節(jié)碼轉(zhuǎn)換和分析算法,可以從中構(gòu)建自定義的復(fù)雜轉(zhuǎn)換和代碼分析工具。ASM 可以直接產(chǎn)生二進(jìn)制 class 文件,也可以在類被加載入 Java 虛擬機(jī)之前動態(tài)改變類行為。Java class 被存儲在嚴(yán)格格式定義的 .class文件里,這些類文件擁有足夠的元數(shù)據(jù)來解析類中的所有元素:類名稱、方法、屬性以及 Java 字節(jié)碼(指令)。ASM從類文件中讀入信息后,能夠改變類行為,分析類信息,甚至能夠根據(jù)用戶要求生成新類。

ASM 提供與其他 Java 字節(jié)碼框架類似的功能,但側(cè)重于 性能。因?yàn)樗弧冈O(shè)計(jì)和實(shí)現(xiàn)得盡可能小和盡可能快」,所以它「非常適合在動態(tài)系統(tǒng)中使用」(但當(dāng)然也可以以靜態(tài)方式使用,例如在編譯器中)。ASM 字節(jié)碼增強(qiáng)技術(shù)主要是用來反射的時候提升性能的,如果單純用jdk的反射調(diào)用,性能是非常低下的,而使用字節(jié)碼增強(qiáng)技術(shù)后反射調(diào)用的時間已經(jīng)基本可以與直接調(diào)用相當(dāng)。

ASM:

https://asm.ow2.io/index.html。

「ASM 字節(jié)碼處理流程:」目標(biāo)類 class bytes -> ClassReader解析 -> ClassVisitor增強(qiáng)修改字節(jié)碼 -> ClassWriter生成增強(qiáng)后的 class bytes。

「Arthas 如何做到無需重啟 attach 到 JVM (ASM + Instrument 處理流程):」

目標(biāo)類 class bytes -> ClassReader解析 -> ClassVisitor增強(qiáng)修改字節(jié)碼 -> ClassWriter生成增強(qiáng)后的 class bytes -> 通過Instrument解析加載為新的Class.

責(zé)任編輯:姜華 來源: Java架構(gòu)師進(jìn)階編程
相關(guān)推薦

2024-05-10 08:19:59

arthasjava字節(jié)碼

2018-10-22 12:50:20

CDN網(wǎng)絡(luò)內(nèi)容發(fā)布網(wǎng)絡(luò)

2020-10-22 08:25:22

JavaScript運(yùn)作原理

2018-12-27 09:28:08

Consul服務(wù)Server

2023-04-06 08:37:24

2020-10-09 08:15:11

JsBridge

2017-09-05 08:52:37

Git程序員命令

2022-02-21 09:44:45

Git開源分布式

2021-06-30 00:20:12

Hangfire.NET平臺

2021-04-09 08:40:51

網(wǎng)絡(luò)保險網(wǎng)絡(luò)安全網(wǎng)絡(luò)風(fēng)險

2023-05-12 08:19:12

Netty程序框架

2024-06-25 08:18:55

2019-04-17 15:16:00

Sparkshuffle算法

2021-11-04 10:34:02

JavaScript繼承編程

2019-07-23 08:55:46

Base64編碼底層

2022-02-18 00:13:53

JavaScript編程語言數(shù)組

2014-08-08 15:22:20

2023-05-08 08:21:15

JavaNIO編程

2023-07-28 07:14:13

2024-04-19 14:23:52

SwitchJavaScript開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號