精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JVM源碼分析之Attach機制實現完全解讀

開發 后端
那Attach機制是什么?說簡單點就是jvm提供一種jvm進程間通信的能力,能讓一個進程傳命令給另外一個進程,并讓它執行內部的一些操作。

Attach是什么

在講這個之前,我們先來點大家都知道的東西,當我們感覺線程一直卡在某個地方,想知道卡在哪里,首先想到的是進行線程dump,而常用的命令是jstack ,我們就可以看到如下線程棧了

大家是否注意過上面圈起來的兩個線程,”Attach Listener”和“Signal Dispatcher”,這兩個線程是我們這次要講的Attach機制的關鍵,先偷偷告訴各位,其實Attach Listener這個線程在jvm起來的時候可能并沒有的,后面會細說。

那Attach機制是什么?說簡單點就是jvm提供一種jvm進程間通信的能力,能讓一個進程傳命令給另外一個進程,并讓它執行內部的一些操作,比如說我們為了讓另外一個jvm進程把線程dump出來,那么我們跑了一個jstack的進程,然后傳了個pid的參數,告訴它要哪個進程進行線程dump,既然是兩個進程,那肯定涉及到進程間通信,以及傳輸協議的定義,比如要執行什么操作,傳了什么參數等

Attach能做些什么

總結起來說,比如內存dump,線程dump,類信息統計(比如加載的類及大小以及實例個數等),動態加載agent(使用過btrace的應該不陌生),動態設置vm flag(但是并不是所有的flag都可以設置的,因為有些flag是在jvm啟動過程中使用的,是一次性的),打印vm flag,獲取系統屬性等,這些對應的源碼(AttachListener.cpp)如下 

  1. static AttachOperationFunctionInfo funcs[] = {  
  2.   { "agentProperties",  get_agent_properties },  
  3.   { "datadump",         data_dump },  
  4.   { "dumpheap",         dump_heap },  
  5.   { "load",             JvmtiExport::load_agent_library },  
  6.   { "properties",       get_system_properties },  
  7.   { "threaddump",       thread_dump },  
  8.   { "inspectheap",      heap_inspection },  
  9.   { "setflag",          set_flag },  
  10.   { "printflag",        print_flag },  
  11.   { "jcmd",             jcmd },  
  12.   { NULL,               NULL }  
  13. }; 

后面是命令對應的處理函數。

Attach在jvm里如何實現的

Attach Listener線程的創建

前面也提到了,jvm在啟動過程中可能并沒有啟動Attach Listener這個線程,可以通過jvm參數來啟動,代碼 (Threads::create_vm)如下: 

  1. if (!DisableAttachMechanism) {  
  2.    if (StartAttachListener || AttachListener::init_at_startup()) {  
  3.      AttachListener::init();  
  4.    }  
  5.  }  
  6. ool AttachListener::init_at_startup() {  
  7.  if (ReduceSignalUsage) {  
  8.    return true;  
  9.  } else {  
  10.    return false;  
  11.  } 

其中DisableAttachMechanism,StartAttachListener ,ReduceSignalUsage均默認是false(globals.hpp) 

  1. product(bool, DisableAttachMechanism, false,                         
  2.           "Disable mechanism that allows tools to Attach to this VM”)     
  3. product(bool, StartAttachListener, false,                                
  4.            "Always start Attach Listener at VM startup")    
  5. product(bool, ReduceSignalUsage, false,                                    
  6.            "Reduce the use of OS signals in Java and/or the VM”) 

因此AttachListener::init()并不會被執行,而Attach Listener線程正是在此方法里創建的

既然在啟動的時候不會創建這個線程,那么我們在上面看到的那個線程是怎么創建的呢,這個就要關注另外一個線程“Signal Dispatcher”了,顧名思義是處理信號的,這個線程是在jvm啟動的時候就會創建的,具體代碼就不說了。

下面以jstack的實現來說明觸發Attach這一機制進行的過程,jstack命令的實現其實是一個叫做JStack.java的類,查看jstack代碼后會走到下面的方法里

請注意VirtualMachine.Attach(pid);這行代碼,觸發Attach pid的關鍵,如果是在linux下會走到下面的構造函數

這里要解釋下代碼了,首先看到調用了createAttachFile方法在目標進程的cwd目錄下創建了一個文件/proc//cwd/.Attach_pid,這個在后面的信號處理過程中會取出來做判斷(為了安全),另外我們知道在linux下線程是用進程實現的,在jvm啟動過程中會創建很多線程,比如我們上面的信號線程,也就是會看到很多的pid(應該是LWP),那么如何找到這個信號處理線程呢,從上面實現來看是找到我們傳進去的pid的父進程,然后給它的所有子進程都發送一個SIGQUIT信號,而jvm里除了信號線程,其他線程都設置了對此信號的屏蔽,因此收不到該信號,于是該信號就傳給了“Signal Dispatcher”,在傳完之后作輪詢等待看目標進程是否創建了某個文件,AttachTimeout默認超時時間是5000ms,可通過設置系統變量sun.tools.Attach.AttachTimeout來指定,下面是Signal Dispatcher線程的entry實現

當信號是SIGBREAK(在jvm里做了#define,其實就是SIGQUIT)的時候,就會觸發

AttachListener::is_init_trigger()的執行

一開始會判斷當前進程目錄下是否有個.Attach_pid文件(前面提到了),如果沒有就會在/tmp下創建一個/tmp/.Attach_pid,當那個文件的uid和自己的uid是一致的情況下(為了安全)再調用init方法

此時水落石出了,看到創建了一個線程,并且取名為Attach Listener。再看看其子類LinuxAttachListener的init方法

看到其創建了一個監聽套接字,并創建了一個文件/tmp/.java_pid,這個文件就是客戶端之前一直在輪詢等待的文件,隨著這個文件的生成,意味著Attach的過程圓滿結束了。

Attach listener接收請求

看看它的entry實現Attach_listener_thread_entry

從代碼來看就是從隊列里不斷取AttachOperation,然后找到請求命令對應的方法進行執行,比如我們一開始說的jstack命令,找到 { “threaddump”, thread_dump }的映射關系,然后執行thread_dump方法

再來看看其要調用的AttachListener::dequeue(), 

  1. AttachOperation* AttachListener::dequeue() {  
  2.   JavaThread* thread = JavaThread::current();  
  3.   ThreadBlockInVM tbivm(thread);  
  4.   thread->set_suspend_equivalent();  
  5.   // cleared by handle_special_suspend_equivalent_condition() or  
  6.   // java_suspend_self() via check_and_wait_while_suspended()  
  7.   AttachOperation* op = LinuxAttachListener::dequeue();  
  8.   // were we externally suspended while we were waiting?  
  9.   thread->check_and_wait_while_suspended();  
  10.   return op;  

最終調用的是LinuxAttachListener::dequeue(),

我們看到如果沒有請求的話,會一直accept在那里,當來了請求,然后就會創建一個套接字,并讀取數據,構建出LinuxAttachOperation返回并執行。

整個過程就這樣了,從Attach線程創建到接收請求,處理請求。 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2017-01-12 14:52:03

JVMFinalRefere源碼

2017-01-11 14:02:32

JVM源碼內存

2017-01-11 14:19:26

JVM源碼All

2010-09-26 16:55:31

JVM學習筆記

2023-10-31 16:00:51

類加載機制Java

2024-09-06 09:37:45

WebApp類加載器Web 應用

2017-02-27 11:48:58

JVM源碼分析Java

2021-11-11 17:40:08

WatchdogAndroid源碼分析

2020-07-21 14:19:18

JVM編程語言

2022-05-19 07:09:29

機制沙箱安全JVM

2024-10-31 09:24:42

2017-01-11 22:51:39

2021-03-11 08:10:48

JVM對象的創建School

2011-06-23 13:10:39

Python 對象機制

2011-05-26 10:05:48

MongoDB

2022-07-19 20:04:31

NAPI模塊鴻蒙

2022-09-23 08:02:42

Kafka消息緩存

2010-09-26 16:14:22

JVM實現機制JVM

2012-05-31 02:54:07

HadoopJava

2010-09-27 10:30:42

JVM對象生命周期
點贊
收藏

51CTO技術棧公眾號

特级毛片在线免费观看| 亚洲免费av高清| 久久久久久亚洲精品不卡| 国产成人av免费观看| www.久久ai| 国产精品中文字幕日韩精品| 欧美日韩aaaa| 欧美大片免费播放器| 成人午夜视屏| 欧美韩日一区二区三区| 91麻豆桃色免费看| 国产精品99无码一区二区| 日韩av中文字幕一区| 色综合天天在线| 正在播放久久| www.热久久| 亚洲级视频在线观看免费1级| 国产综合色香蕉精品| 婷婷社区五月天| av日韩在线播放| av片在线免费观看| 亚洲欧美日韩综合国产aⅴ| 日韩精品小视频| 欧美精品日日鲁夜夜添| 91视频国产高清| 欧美三级小视频| 欧美aaaaa级| 女人丝袜激情亚洲| 韩曰欧美视频免费观看| 一区二区三区四区视频在线观看| 91亚洲国产成人精品一区| 激情综合中文娱乐网| 亚洲码在线观看| 亚洲第一成肉网| 三上悠亚亚洲一区| 亚洲综合色视频| 亚洲美女网站18| 午夜在线视频观看| 国产麻豆精品久久一二三| 热久久免费视频精品| 国产午夜精品理论片| 蜜桃视频最新网址| 国产精品nxnn| 荡女精品导航| 亚洲女人****多毛耸耸8| 欧美日韩免费精品| 丰满人妻一区二区三区无码av | 欧美日韩亚洲视频| 波多野结衣激情| 色网站免费观看| 久久久一二三| 午夜精品一区二区三区在线视| 国产探花视频在线播放| 最新国产一区| 日韩国产在线播放| 中文字幕免费高清视频| 99久久香蕉| 91精品国产综合久久福利 | 性高潮久久久久久久久久| 国模娜娜一区二区三区| 国产精品久久久久免费a∨大胸| 亚洲一区欧美在线| 精品96久久久久久中文字幕无| 精品国产一区久久久| 中文字幕一二三四区| 红杏视频成人| 欧美一区二区三区视频免费| www.超碰97.com| 黄色在线观看www| 亚洲国产成人高清精品| 久久人妻无码一区二区| 97超碰资源站在线观看| 亚洲人成网站在线| 91看片淫黄大片91| 91小视频xxxx网站在线| 亚洲三级小视频| 性生活免费观看视频| 麻豆视频在线播放| 亚洲女人小视频在线观看| 亚洲第一精品区| 91在线中文| 亚洲综合成人在线视频| www成人免费| 2018av在线| 欧美日韩一区二区三区在线免费观看 | 亚洲自拍偷拍福利| 精品区在线观看| 国产在线国偷精品产拍免费yy| 91亚洲一区精品| 国产成人a人亚洲精品无码| 亚洲自拍偷拍色片视频| 免费看日韩毛片| 图片小说视频色综合| 亚洲视频专区在线| 免费福利视频网站| 欧美国产偷国产精品三区| 久久九九有精品国产23| 免费毛片在线播放免费| 亚洲大片av| 国产成人一区二区三区电影| 中文字幕网址在线| 国产一区二区日韩精品| 成人免费在线一区二区三区| 网站黄在线观看| 久久久高清一区二区三区| 中文字幕在线观看一区二区三区| 中文在线字幕免费观看| 一区二区三区精品在线观看| 国产91在线免费| 成人黄色免费网站| 日韩欧美二区三区| 成都免费高清电影| 亚洲欧美网站在线观看| 欧美一级电影久久| 69av视频在线观看| 国精产品一区一区三区mba桃花| 成人黄色在线免费观看| 你懂的视频在线| 亚洲三级久久久| 日韩avxxx| 国产999精品在线观看| 亚洲激情 国产| 国产又粗又长又黄的视频| 狠狠综合久久| 午夜精品一区二区三区在线视频 | 一区视频二区视频| 日本不卡影院| 欧美日韩在线视频观看| 色一情一区二区三区| 啪啪国产精品| 欧美成人h版在线观看| 加勒比在线一区| 丁香亚洲综合激情啪啪综合| 日韩视频在线观看国产| 波多野在线观看| 欧美日本一区二区三区四区| www国产视频| 国产精品97| 国产精品www网站| 国产激情视频在线播放| 久久综合九色综合久久久精品综合| 中国人体摄影一区二区三区| 免费看av不卡| 91精品久久久久久久91蜜桃| a级在线免费观看| 91久久久久| 99re在线播放| a级片国产精品自在拍在线播放| 在线日韩av片| 在哪里可以看毛片| 国产欧美短视频| 都市激情久久久久久久久久久| 成年网站在线| 日韩欧美亚洲国产一区| 亚洲午夜久久久久久久久| 欧美成人有码| 国产一区视频在线| 欧美成人视屏| 欧美日韩mp4| 快灬快灬一下爽蜜桃在线观看| 亚洲在线电影| 蜜桃精品久久久久久久免费影院| 999福利在线视频| 亚洲国产91精品在线观看| 激情五月婷婷在线| 国产凹凸在线观看一区二区| 青青草免费在线视频观看| 精品中文字幕一区二区三区四区 | 91精品国产91| 亚洲人成色777777精品音频| 一区二区三区国产| 男生和女生一起差差差视频| 欧美一区二区三区红桃小说| 欧美激情videos| 日批视频在线播放| 狠狠躁夜夜躁人人躁婷婷91 | 国产cdts系列另类在线观看| 91精品国产综合久久蜜臀| 欧洲美女女同性互添| 国产精品一级在线| 国产一二三在线视频| 欧美日韩导航| 国产不卡一区二区在线播放| 国产大片在线免费观看| 欧美丝袜自拍制服另类| 女女互磨互喷水高潮les呻吟| 日韩av中文字幕一区二区三区| 视频三区二区一区| 成年永久一区二区三区免费视频| 久久久www成人免费精品| 性生交生活影碟片| 岛国av一区二区| 玖草视频在线观看| 日本不卡不码高清免费观看| 亚洲欧洲日夜超级视频| 亚州一区二区三区| 欧美剧在线观看| 天天干在线观看| 欧美午夜影院一区| 九九九在线视频| 91污片在线观看| 亚洲另类第一页| 亚洲精品看片| 亚洲成人a**址| 97人人澡人人爽91综合色| 欧洲午夜精品久久久| 免费人成在线观看播放视频| 欧美精品一区二区三区一线天视频| 国产91精品一区| 国产精品无码永久免费888| 人妻体体内射精一区二区| 西西裸体人体做爰大胆久久久| 亚洲精品高清国产一线久久| 亚州一区二区| 国产精品18久久久久久麻辣| 国产成人在线视频免费观看| 亚洲精品国产欧美| 黄色片网站在线免费观看| 国产精品污www在线观看| 亚洲热在线视频| 久久综合九色| 国产毛片视频网站| 7777久久香蕉成人影院| 精品免费国产| 欧美高清hd| 国产精品久久久久999| av伦理在线| 日韩一区二区三区在线播放| 手机在线精品视频| 日韩一区二区免费高清| 波多野结衣在线电影| 欧美日韩免费看| 欧美成人精品欧美一级| 中文字幕日韩精品一区| 玖草视频在线观看| 国产.精品.日韩.另类.中文.在线.播放| 国产成人精品无码播放| 99在线热播精品免费99热| 免费成人深夜夜行网站视频| 欧美日韩国产传媒| 久久久精品动漫| 91精品入口| 51国产成人精品午夜福中文下载 | 主播福利视频一区| 精品电影在线| 亚洲人成网站色ww在线| 日本激情一区二区| 欧美大片一区二区三区| 国产青青草视频| 欧美人妖巨大在线| 亚洲天堂一区在线| 欧美日韩在线视频首页| 影音先锋亚洲天堂| 一区二区三区四区在线播放| 国产18无套直看片| 久久精品视频一区二区| 漂亮人妻被黑人久久精品| 国产成人一区二区精品非洲| www激情五月| 精品一区二区综合| 色www免费视频| 狠狠色丁香婷婷综合久久片| 欧美日韩中文不卡| 麻豆国产精品官网| av亚洲天堂网| 精品一区二区三区视频| 国产精品久久久久久久av福利| 六月丁香婷婷久久| 在线观看免费视频高清游戏推荐| 日韩国产欧美在线视频| 中文久久久久久| 美腿丝袜在线亚洲一区 | 99久久精品久久亚洲精品| www国产精品av| 色欲av无码一区二区三区| 91免费观看在线| 毛片网站免费观看| 92国产精品观看| 人妻 丝袜美腿 中文字幕| 成人国产免费视频| 熟妇高潮精品一区二区三区| 久久精品欧美一区二区三区麻豆| 日本猛少妇色xxxxx免费网站| 国产精品嫩草影院av蜜臀| 国产精品成人69xxx免费视频| 亚洲欧美日韩成人高清在线一区| 久久久久久久国产视频| 自拍视频在线观看一区二区| 久久久久久久久久久网| 岛国av午夜精品| 夜夜躁狠狠躁日日躁av| 日韩手机在线导航| 视频在线观看你懂的| 伊人伊人伊人久久| 性欧美videoshd高清| 欧美综合一区第一页| 久久久国产精品网站| 99国产在线| 天天躁日日躁狠狠躁欧美| 五月婷婷一区| 亚洲第一网站| 在线免费av播放| 国产成人啪午夜精品网站男同| 免费无码一区二区三区| 中文字幕在线一区免费| 精品视频久久久久| 91国偷自产一区二区开放时间| 国产乱码一区二区| 欧美va亚洲va香蕉在线| 色综合久久网女同蕾丝边| 久久精品国产亚洲精品| wwwav在线| 国产精品久久久久久久久久久新郎| 免费一级欧美在线大片| 久久综合入口| 婷婷综合亚洲| 免费看a级黄色片| 成人午夜激情影院| sm捆绑调教视频| 色综合久久六月婷婷中文字幕| 亚洲精品18p| 色偷偷888欧美精品久久久| av日韩国产| 91亚洲精品久久久| 第一会所亚洲原创| 国产精品999视频| 欧美a级理论片| 无遮挡aaaaa大片免费看| 国产精品国产三级国产aⅴ入口| 亚洲国产精品成人无久久精品| 日本精品一级二级| 成人小说亚洲一区二区三区| 国产一区二区三区久久精品| 91国内在线| 欧美在线影院在线视频| 视频在线亚洲| 免费成人进口网站| 男女性色大片免费观看一区二区| 人妻大战黑人白浆狂泄| 午夜精品成人在线视频| 国产又粗又黄视频| 亚洲第一精品久久忘忧草社区| 成人免费高清| 国产欧美日韩高清| 第一社区sis001原创亚洲| 欧美两根一起进3p做受视频| av一二三不卡影片| 久久久久久久福利| 日韩精品最新网址| av网站网址在线观看| 国产精品中文字幕在线观看| 亚洲丝袜啪啪| 国产亚洲精品网站| 久久精品夜色噜噜亚洲a∨| 天堂网免费视频| 亚洲女在线观看| 日本韩国欧美| 欧美美乳视频网站在线观看| 国产精品日韩精品欧美精品| 中国一级特黄录像播放| 精品国产精品自拍| 婷婷伊人综合中文字幕| 久久久久久久香蕉网| 精品五月天堂| 欧美三级一级片| 久久久久久久av麻豆果冻| 婷婷激情五月网| 亚洲精品www久久久| 久久夜夜操妹子| 午夜午夜精品一区二区三区文| 蜜桃视频免费观看一区| 欧美风情第一页| 日韩精品自拍偷拍| 九色porny丨国产首页在线| 蜜桃传媒视频麻豆一区| 日韩国产欧美三级| 黄色激情小视频| 日韩一级成人av| av蜜臀在线| 日韩.欧美.亚洲| 激情五月激情综合网| 国产这里有精品| 6080yy午夜一二三区久久| 成人日日夜夜| 91久久精品www人人做人人爽| 国产精品激情| 日本黄色网址大全| 欧美日韩一区二区三区四区五区| 黄色免费网站在线| 国产精品对白一区二区三区| 香蕉久久a毛片| 久久一级免费视频| 欧美videos中文字幕| 欧美成人黑人| 潘金莲一级淫片aaaaa免费看| jiyouzz国产精品久久| 成人黄色激情视频| 欧美猛男性生活免费| 要久久电视剧全集免费| 亚洲一区二区偷拍|