java agent技術

?從JDK1.5之后引入了java angent技術

Java Agent 是一種強大的技術,它允許開發者在 JVM 啟動時運行期間動態地修改類的字節碼,從而實現諸如性能監控、日志記錄、AOP(面向切面編程)等功能

java agent依賴于Instrumentation API,是 Java 提供的一個用于操作已加載類的字節碼的標準API。通過這個API,你可以修改類的字節碼,甚至可以在不重啟應用的情況下重新定義已經加載的類

具體的實現過程是通過一個agent來對字節碼進行修改,agent實際上是一個特殊的jar包,包含了一個或多個特定的方法(premainagentmain),這些方法會在JVM啟動時或者運行期間被調用

premain:

顧名思義是在應用程序的main函數執行之前執行的

1.在 premain 方法執行時,JVM 已經加載了一些基礎類,但你的應用程序的主要類(以及其它未加載的類)通常還沒有被加載。

2.通過 premain 方法中注冊的 ClassFileTransformer 可以攔截并修改之后加載的所有類的字節碼

3.如果你希望通過 Java Agent 修改某個類的行為,確保該類在 premain 方法中已經注冊了相應的轉換器是很重要的。對于已經加載的類,你需要使用 retransformClasses 或其他方法來重新處理它們。

對于這種方式實現的agent需要在啟動應用程序的時候通過參數指定執行這個agenr的jar包

agentmain:

需要通過attach API通過 Attach API 動態加載 Agent,允許你對已經加載的類進行重新轉換(retransform)

對于這種方式實現的agent可以在運行時通過Attach API 動態執行

主要注意的時動態執行agent的時候,如果原應用程序中的方法已經在執行的話,正在執行的方法會按照舊的字節碼信息繼續執行,但是agent執行之后的方法執行的是根據agent修改之后新的字節碼信息

新舊共存的原理:

類加載之后方法的字節碼是存在方法區中的,agent修改字節碼之后原來舊的字節碼將會被覆蓋,那么新舊是怎么共存的呢?

實際上jvm中,每加載一個類就會對應生成一個klass對象來表示這個類的元數據結構

方法區中會存儲已被虛擬機加載的類信息、常量、靜態變量等。也就是方法區中的類信息指向這個klass對象

當字節碼被修改之后,方法區中類信息會更新為最新的klass對象,即方法區中存儲的都是最新的類信息

在方法調用執行的時候,會創建一個棧幀,棧幀并不直接指向方法區中的字節碼,而是依賴于類的?Klass?對象提供的元數據來執行字節碼

所以即使修改了類的字節碼,只是新建了一個klass對象,并且方法區中指向了這個新的klass對象,但是棧幀并不知道方法區中的變化,因為棧幀只是在創建的時候綁定了一個klass對象,并且根據這個klass對象來執行上下文

那兩種agent方法可以共存嗎?

是可以共存的,但是不會在同一 JVM 實例中同時執行。

通過參數啟動的話只會執行premain方法內的邏輯,通過attach API的話只會執行agentmain方法中的邏輯

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905159.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905159.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905159.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LLaMA Factory 深度調參

注意,本文涵蓋從基礎調參到前沿研究的完整知識體系,建議結合具體業務場景靈活應用。一篇“參考文獻”而非“可運行的代碼”。https://github.com/zysNLP/quickllm 初始指令: llamafactory-cli train \--stage sft \--do_train True \--mode…

Linux驅動:驅動編譯流程了解

要求 1、開發板中的linux的zImage必須是自己編譯的 2、內核源碼樹,其實就是一個經過了配置編譯之后的內核源碼。 3、nfs掛載的rootfs,主機ubuntu中必須搭建一個nfs服務器。 內核源碼樹 解壓 tar -jxvf x210kernel.tar.bz2 編譯 make x210ii_qt_defconfigmakeCan’t use ‘…

Redis集群模式、持久化、過期策略、淘汰策略、緩存穿透雪崩擊穿問題

Redis四種模式 單節點模式 架構??:單個Redis實例運行在單臺服務器。 ??優點??: ??簡單??:部署和配置容易,適合開發和測試。 ??低延遲??:無網絡通信開銷。 ??缺點??: ??單點故障??&…

1.2 函數

函數的本質是描述變量間的依賴關系:??一個變量(自變量)的變化會唯一確定另一個變量(因變量)的值??。 ??基本構成??:通過符號(如YF(X))表達規則,X輸入 → F處理 …

2025數字孿生技術全景洞察:從工業革命到智慧城市的跨越式發展

引言 數字孿生技術,這一融合物理世界與虛擬鏡像的革新性工具,正以驚人的速度重塑產業格局。2025年,中國數字孿生市場規模預計達214億元,工業制造領域占比超40%,其技術深度與行業落地成果令人矚目。本文將結合最新數據與…

RabbitMQ 工作模式

RabbitMQ 一共有 7 中工作模式,可以先去官網上了解一下(一下截圖均來自官網):RabbitMQ 官網 Simple P:生產者,要發送消息的程序;C:消費者,消息的接受者;hell…

VBA會被Python代替嗎

VBA不會完全被Python取代、但Python在自動化、數據分析與跨平臺開發等方面的優勢使其越來越受歡迎、兩者將長期并存且各具優勢。 Python以其易于學習的語法、強大的開源生態系統和跨平臺支持,逐漸成為自動化和數據分析領域的主流工具。然而,VBA依舊在Exc…

【開源工具】深度解析:基于PyQt6的Windows時間校時同步工具開發全攻略

🕒 【開源工具】深度解析:基于PyQt6的Windows時間校時同步工具開發全攻略 🌈 個人主頁:創客白澤 - CSDN博客 🔥 系列專欄:🐍《Python開源項目實戰》 💡 熱愛不止于代碼,熱…

大模型項目:普通藍牙音響接入DeepSeek,解鎖語音交互新玩法

本文附帶視頻講解 【代碼宇宙019】技術方案:藍牙音響接入DeepSeek,解鎖語音交互新玩法_嗶哩嗶哩_bilibili 目錄 效果演示 核心邏輯 技術實現 大模型對話(技術: LangChain4j 接入 DeepSeek) 語音識別(…

qt命名空間演示

#ifndef CIR_H #define CIR_Hnamespace cir {double PI3.141592653;//獲取圓行周長double getLenthOfCircle(double radius){return 2*PI*radius;}//獲取圓形面積double getAreaOfCircle(double radius){return PI*radius*radius;}} #endif // CIR_H#include <iostream> …

使用 Java 反射動態加載和操作類

Java 的反射機制(Reflection)是 Java 語言的一大特色,它允許程序在運行時檢查、加載和操作類、方法、字段等元信息。通過 java.lang.Class 和 java.lang.reflect 包,開發者可以動態加載類、創建實例、調用方法,甚至在運行時構造新類。反射是 Java 靈活性的核心,廣泛應用于…

《 C++ 點滴漫談: 三十七 》左值?右值?完美轉發?C++ 引用的真相超乎你想象!

摘要 本文全面系統地講解了 C 中的引用機制&#xff0c;涵蓋左值引用、右值引用、引用折疊、完美轉發等核心概念&#xff0c;并深入探討其底層實現原理及工程實踐應用。通過詳細的示例與對比&#xff0c;讀者不僅能掌握引用的語法規則和使用技巧&#xff0c;還能理解引用在性能…

【AutoGen深度解析】下一代AI代理編程框架實戰指南

目錄 &#x1f31f; 前言&#x1f3d7;? 技術背景與價值&#x1f6a7; 當前技術痛點&#x1f6e0;? 解決方案概述&#x1f465; 目標讀者說明 &#x1f50d; 一、技術原理剖析&#x1f5bc;? 核心概念圖解&#x1f4a1; 核心作用講解?? 關鍵技術模塊說明&#x1f504; 技術…

Python-AI調用大模型 給出大模型人格案例

Python調用通義千問模擬原神雷電將軍口吻 最近在用AI編輯器寫AI對話 嘗試給AI對話增加人格 以下是使用阿里通義千問大模型模擬《原神》中雷電將軍(雷電影)口吻的代碼案例&#xff0c;包含典型的高傲威嚴、略帶古風的說話風格。 完整后端代碼示例 import dashscope from dash…

csdn博客打賞功能

CSDN_專業開發者社區_已接入DeepSeekR1滿血版 官網: 最右下角 耳機 就是客服 可以轉人工 開啟打賞功能如下: 1.因為博主本人不可以對本人賬號文章進行打賞&#xff0c;因此本人賬號打開文章詳情頁不顯示打賞按鈕。為了驗證賬號設置的打賞功能是否生效所以讓您使用無痕模式模…

【深度學習】目標檢測算法大全

目錄 一、R-CNN 1、R-CNN概述 2、R-CNN 模型總體流程 3、核心模塊詳解 &#xff08;1&#xff09;候選框生成&#xff08;Selective Search&#xff09; &#xff08;2&#xff09;深度特征提取與微調 2.1 特征提取 2.2 網絡微調&#xff08;Fine-tuning&#xff09; …

26考研——中央處理器_指令流水線_指令流水線的基本概念 流水線的基本實現(5)

408答疑 文章目錄 六、指令流水線指令流水線的基本概念流水線的基本實現流水線設計的原則流水線的邏輯結構流水線的時空圖表示 八、參考資料鮑魚科技課件26王道考研書 六、指令流水線 前面介紹的指令都是在單周期處理機中采用串行方法執行的&#xff0c;同一時刻 CPU 中只有一…

配置集群(yarn)

在配置 YARN 集群前&#xff0c;要先完成以下準備工作&#xff1a; 集群環境規劃&#xff1a;明確各節點的角色&#xff0c;如 ResourceManager、NodeManager 等。網絡環境搭建&#xff1a;保證各個節點之間能夠通過網絡互通。時間同步設置&#xff1a;安裝 NTP 服務&#xff0…

vue實現與后臺springboot傳遞數據【傳值/取值 Axios 】

vue實現與后臺springboot傳遞數據【傳值/取值】 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是node.js和vue的使用。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性。【幫幫志系列文章】&#xff1a;每…

二叉樹路徑總和

一、給你二叉樹的根節點 root 和一個表示目標和的整數 targetSum 。判斷該樹中是否存在根節點到葉子節點的路徑&#xff0c;這條路徑上所有節點值相加等于目標和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 112. 路徑總和 - 力扣&…