日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
JVM:有些內(nèi)部信息我悄悄告訴你

JVM:有些內(nèi)部信息我悄悄告訴你

作者: 侯樹(shù)成 2020-12-30 09:18:46

云計(jì)算

虛擬化 對(duì)于 Java 的反射使用, 一般用戶(hù)都有所了解。特別是在開(kāi)源框架里更是大量的使用。通過(guò)反射,我們能拿到一個(gè)Java Class 的信息。

對(duì)于 Java 的反射使用, 一般用戶(hù)都有所了解。特別是在開(kāi)源框架里更是大量的使用。通過(guò)反射,我們能拿到一個(gè)Java Class 的信息。那對(duì)于 JVM 的內(nèi)部信息,像堆的使用情況、線程、甚至是創(chuàng)建對(duì)象的內(nèi)存地址、加載的類(lèi)的內(nèi)容,該怎么辦呢?

其實(shí)在 JVM內(nèi),有許多內(nèi)部的信息,比如上面提到的那些,就類(lèi)似于生活中的內(nèi)部消息一樣。你可以想像一些大型應(yīng)用,一些用戶(hù)的數(shù)據(jù)我們只能通過(guò) API 授權(quán)的方式拿到,普通用戶(hù)正常使用的時(shí)候,是不可能獲取到這些內(nèi)容的。就像做為運(yùn)行在 JVM 上的普通 Java應(yīng)用,也很難拿到 JVM 的信息,畢竟 JVM 更底層,是C++ 開(kāi)發(fā)的。

JVM 會(huì)把這些內(nèi)部信息告訴咱們嗎?

JVM 提供了一些對(duì)外的接口,把它的內(nèi)部信息披露了出來(lái)。通過(guò)這些接口SA 才得以訪問(wèn)到 JVM 內(nèi)部類(lèi)的結(jié)構(gòu)和地址,也才能從底層觀察到 JVM內(nèi)部運(yùn)行的細(xì)節(jié)。

你看在SA 圖形界面的HSDB內(nèi)部,長(zhǎng)長(zhǎng)的菜單列表,大多都是通過(guò)普通Java 應(yīng)用獲取不到的「內(nèi)部信息」。

這些都是怎么實(shí)現(xiàn)的呢?說(shuō)到這兒,就不得不提 gHotSpotVMStructs。

JVM 給提供的那些接口,核心是 gHotSpotVMStructs 這個(gè)結(jié)構(gòu)。它對(duì)外暴露了JVM內(nèi)部的大量信息,像原始的堆的地址,線程、棧的地址等等。

gHotSpotVMStructs結(jié)構(gòu)指向了很多類(lèi)以及這些類(lèi)的字段信息。每個(gè)類(lèi)都有一系列的字段,每個(gè)字段又有自己的名字,類(lèi)型,是否靜態(tài)等等。如果是靜態(tài)字段這個(gè)結(jié)構(gòu)還可以用來(lái)訪問(wèn)它的值。對(duì)于一個(gè)靜態(tài)的對(duì)象字段,這個(gè)結(jié)構(gòu)體還會(huì)提供目標(biāo)對(duì)象的地址。通過(guò)這個(gè)根地址我們可以開(kāi)始反查JVM內(nèi)部的一些組件,包括編譯器,線程還有堆。

所以要獲取和理解JVM 這些內(nèi)部信息的關(guān)鍵,是在如何解析這個(gè)gHotSpotVMStructs 結(jié)構(gòu)里面的數(shù)據(jù)。JVM不僅暴露了它的內(nèi)部類(lèi)型系統(tǒng)的地址和根對(duì)象地址,還有用以解析這些數(shù)據(jù)的一些額外的符號(hào)和值。這包含類(lèi)描述信息和每個(gè)字段在這個(gè)類(lèi)里的偏移量,此外 JVM開(kāi)發(fā)者又做了一系列的工作,手動(dòng)把JVM內(nèi)部的C++類(lèi)的字段映射并加載到了全局的gHotSpotVMStructs結(jié)構(gòu)里。

SA 就是解析這些信息最好的例子。通過(guò)圖形界面我們能直觀感受到解析這些信息了解到了什么,通過(guò)翻譯 gHotSpotVMStructs暴露出的這些信息,生成Java的包裝類(lèi)。通過(guò)這些包裝類(lèi)提供出來(lái)的接口讓訪問(wèn)JVM內(nèi)部系統(tǒng)的工作變的簡(jiǎn)單和方便,和普通的Java 應(yīng)用使用API 類(lèi)似,解決了訪問(wèn)和解析內(nèi)部數(shù)據(jù)的煩惱。

甚至其它的一些調(diào)試工具,診斷工具也是基于這些信息來(lái)實(shí)現(xiàn)的。

通過(guò)我們使用SA的方式,其實(shí)是通過(guò)一個(gè)「ptrace」的系統(tǒng)調(diào)用,掛起目標(biāo)JVM 進(jìn)程,開(kāi)始讀取 gHotSpotVMStructs 這些內(nèi)存信息。

看到上面的內(nèi)容,我們大致理解了SA 的工作原理。那你如果有這樣的需求,是禁止別人通過(guò) SA 等工具來(lái)獲取你JVM 的信息呢?

看,打哪兒指哪兒。答案就是重置gHotSpotVMStructs。這樣工具就不能解析出來(lái)這些信息了。

Stackoverflow 上有個(gè)解決方案,是編譯一個(gè) agent,在啟動(dòng)JVM 的時(shí)候掛上去,并將gHotSpotVMStructs 設(shè)置為0。

  
 
 
 
  1. extern void *gHotSpotVMStructs; 
  2.  
  3. int Agent_OnLoad(void *vm, char *options, void *reserved) { 
  4.     gHotSpotVMStructs = 0; 
  5.     return 0; 

啟動(dòng)的時(shí)候,掛接到JVM上。

  
 
 
 
  1. java -agentpath:/path/to/libnostructs.so ... 

再去執(zhí)行SA 這些工具的時(shí)候,就會(huì)拋出異常提示信息有問(wèn)題

  
 
 
 
  1. Exception in thread "main" java.lang.reflect.InvocationTargetException 
  2.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
  3.         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
  4.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
  5.         at java.lang.reflect.Method.invoke(Method.java:498) 
  6.         at sun.tools.jstack.JStack.runJStackTool(JStack.java:140) 
  7.         at sun.tools.jstack.JStack.main(JStack.java:106) 
  8. Caused by: java.lang.RuntimeException: gHotSpotVMStructs was not initialized properly in the remote process; can not continue 
  9.         at sun.jvm.hotspot.HotSpotTypeDataBase.readVMStructs(HotSpotTypeDataBase.java:418) 
  10.         at sun.jvm.hotspot.HotSpotTypeDataBase.(HotSpotTypeDataBase.java:91) 
  11.         at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:395) 
  12.         at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305) 
  13.         at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140) 
  14.         at sun.jvm.hotspot.tools.Tool.start(Tool.java:185) 
  15.         at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118) 
  16.         at sun.jvm.hotspot.tools.JStack.main(JStack.java:92) 
  17.         ... 6 more 

本文轉(zhuǎn)載自微信公眾號(hào)「Tomcat那些事兒」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Tomcat那些事兒公眾號(hào)。

 


文章題目:JVM:有些內(nèi)部信息我悄悄告訴你
網(wǎng)站路徑:http://www.5511xx.com/article/cdigjjs.html