HotSpot SA(Serviceability Agent)實現(xiàn)原理

占小狼妹蔽,轉(zhuǎn)載請注明原創(chuàng)出處欧芽,謝謝症脂!

jmap倡缠、jstack等工具可以訪問虛擬機中的堆對象、線程信息等迫皱,可以通過兩種方式實現(xiàn)
1歉闰、attach方式
2辖众、SA方式

attach方式

這種方式,在之前的文章已經(jīng)分析過和敬,底層通過socket進行通信凹炸,jmap進程好比一個客戶端,運行的虛擬機看成服務端昼弟,有一個叫"Attach Listener"的線程啤它,專門負責監(jiān)聽attach的請求,并在虛擬機中執(zhí)行對應的代碼舱痘。

更多詳情點擊 jmap命令的實現(xiàn)原理解析

SA方式

首先变骡,我們先看看SA可以做什么?
1芭逝、從運行的Java進程中讀取數(shù)據(jù)
2塌碌、從數(shù)據(jù)中,解析出所有Hotspot數(shù)據(jù)結(jié)構(gòu)
3旬盯、從Hotspot數(shù)據(jù)結(jié)構(gòu)中國台妆,解析出所有的Java對象

這里需要清楚的是:
SA是運行在單獨的進程中,和目標Java進程是隔離的胖翰,而且在使用SA工具時接剩,不會在目標Java進程中執(zhí)行任何代碼,而是讀取目標Java進程中的數(shù)據(jù)萨咳,然后在自身進程中處理懊缺,在SA讀取數(shù)據(jù)時,目標Java進程會被掛起培他。

那么鹃两,SA是如何讀取到目標Java進程的呢?不同的系統(tǒng)靶壮,有不同的方式:
1怔毛、Solaris系統(tǒng)中员萍,通過 libproc 實現(xiàn)
2腾降、Linux系統(tǒng)中,通過 /proc和ptrace 實現(xiàn)
3碎绎、Windows系統(tǒng)中螃壤,通過 dbgeng.dll library 實現(xiàn)

下面以Linux為例强衡,看看是如何一步一步實現(xiàn)的嫉到。

假設執(zhí)行"jmap -heap <pid>",該命令對應的實現(xiàn)類
"sun.jvm.hotspot.tools.HeapSummary.java"

SA的工具類都繼承了Tool類监署,通過start方法啟動日麸,start方法中會初始化一個BugSpotAgent寄啼,并通過BugSpotAgent的attach方法與目標Java進程建立聯(lián)系逮光,attach方法實現(xiàn)如下:

在setupDebugger方法中,根據(jù)不同平臺初始化debugger墩划,attach動作最終由具體的平臺相關的JVMDebugger對象完成涕刚,在Linux平臺,使用LinuxDebuggerLocal對象乙帮,LinuxDebuggerLocal類中具體的attach實現(xiàn)如下:

最終調(diào)用了一個本地方法

private native void attach0(int pid) throws DebuggerException;

本地方法attach0的實現(xiàn)位于LinuxDebuggerLocal.c

在本地方法attach0中杜漠,看到有一個Pgrab方法,跟進去...

Pgrab方法的注釋也說明該方法可以attach到目標進程上察净,從ptrace_attach方法再跟進去...

這里驾茴,我們看到了ptrace命令

ptrace(PTRACE_ATTACH, pid, NULL, NULL)

其中PTRACE_ATTACH,可以實現(xiàn)attach到一個指定pid的進程氢卡。

SA成功attach到目標Java進程之后锈至,執(zhí)行setupVM,初始化Hotspot數(shù)據(jù)結(jié)構(gòu)异吻,之后的數(shù)據(jù)獲取通過/proc實現(xiàn)裹赴,這里不再深入分析了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诀浪,一起剝皮案震驚了整個濱河市棋返,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雷猪,老刑警劉巖睛竣,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異求摇,居然都是意外死亡射沟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門与境,熙熙樓的掌柜王于貴愁眉苦臉地迎上來验夯,“玉大人,你說我怎么就攤上這事摔刁』幼” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵共屈,是天一觀的道長绑谣。 經(jīng)常有香客問我,道長拗引,這世上最難降的妖魔是什么借宵? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮矾削,結(jié)果婚禮上壤玫,老公的妹妹穿的比我還像新娘豁护。我一直安慰自己,他們只是感情好欲间,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布择镇。 她就那樣靜靜地躺著,像睡著了一般括改。 火紅的嫁衣襯著肌膚如雪腻豌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天嘱能,我揣著相機與錄音吝梅,去河邊找鬼。 笑死惹骂,一個胖子當著我的面吹牛苏携,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播对粪,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼右冻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了著拭?” 一聲冷哼從身側(cè)響起纱扭,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎儡遮,沒想到半個月后乳蛾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鄙币,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年肃叶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片十嘿。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡因惭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绩衷,到底是詐尸還是另有隱情蹦魔,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布唇聘,位于F島的核電站版姑,受9級特大地震影響柱搜,放射性物質(zhì)發(fā)生泄漏迟郎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一聪蘸、第九天 我趴在偏房一處隱蔽的房頂上張望宪肖。 院中可真熱鬧表制,春花似錦、人聲如沸控乾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜕衡。三九已至壤短,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慨仿,已是汗流浹背久脯。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留镰吆,地道東北人帘撰。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像万皿,于是被迫代替她去往敵國和親摧找。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一牢硅、什么是Attach機制蹬耘? 簡單點說就是jdk的一些工具類提供的一種jvm進程間通信的能力,能讓一個進程傳命令給...
    俠客楊歌閱讀 10,149評論 0 6
  • Linux SignalsStandard SignalsLinux supports the standard ...
    andersonoy閱讀 660評論 0 0
  • 簡書 占小狼减余,轉(zhuǎn)載請注明原創(chuàng)出處婆赠,謝謝! 當服務發(fā)生GC問題時佳励,一般會使用jmap工具進行分析休里,jmap工具很強大...
    美團Java閱讀 11,434評論 2 40
  • 序 本文主要研究一下openjdk的jhsdb工具 sa-jdi.jar 在java9之前,JAVA_HOME/l...
    go4it閱讀 8,701評論 0 4
  • JVM常用的命令 jps :基礎工具 查看JAVA進程PID赃承。 jps 命令用來查看所有 Java 進程妙黍,每一行就...
    最怕的其實是孤單閱讀 344評論 0 0