溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用HSDB探秘運(yùn)行時(shí)數(shù)據(jù)區(qū)

發(fā)布時(shí)間:2021-10-23 15:55:36 來(lái)源:億速云 閱讀:131 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了如何使用HSDB探秘運(yùn)行時(shí)數(shù)據(jù)區(qū),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

HSDB全稱是HotSpotDebugger, HotSpot虛擬機(jī)的調(diào)試工具,在使用的時(shí)候,需要程序處在暫停的狀態(tài),可以直接使用Idea的debug工具. 使用HSDB可以看到堆棧里面相關(guān)的內(nèi)容,

啟動(dòng)HSDB

無(wú)論哪種方式啟動(dòng),都需要先知道當(dāng)前java程序的進(jìn)程號(hào),我們使用jps命令,如下圖所示:

然后我們使用命令 jhsdb hsdb --pid=87854 來(lái)啟動(dòng)HSDB,如下圖所示:

如何使用HSDB探秘運(yùn)行時(shí)數(shù)據(jù)區(qū)

使用HSDB查看JVM虛擬機(jī)棧信息

我們知道,在創(chuàng)建一個(gè)線程時(shí),都會(huì)有一個(gè)為之分配一個(gè)jvm棧,如上圖我們可以看到在java Threads中有5個(gè)線程,我們選中main線程,然后點(diǎn)擊上面的查看棧信息的圖標(biāo),如下圖所示:

如何使用HSDB探秘運(yùn)行時(shí)數(shù)據(jù)區(qū)

1:在原java Threads面板上,點(diǎn)第二個(gè)按鈕,可召喚出Stack Memory for main 這個(gè)面板.

Stack Memory for main 面板主體有三大部分,如上圖所述

2:最左側(cè)是棧的內(nèi)存地址

3:中間一列是該地址上存的值(大多是別的對(duì)象的地址),

4:最右側(cè)是HotSpot的說(shuō)明

5:在右側(cè)的說(shuō)明中, 我們可以此時(shí)棧中有兩個(gè)棧幀(Frame)

大家看到 Young com/platform/tools/jvm/Main$TestObject 這個(gè)我們定義的對(duì)象,記住這個(gè)地址0x00000001161d11e0 代表這個(gè)對(duì)象是在棧中被引用

使用HSDB查看堆信息

我們的對(duì)象大都是在堆里面,我們可以借助HSDB看堆中有多少個(gè)實(shí)例對(duì)象,如下圖所示

如何使用HSDB探秘運(yùn)行時(shí)數(shù)據(jù)區(qū)

1:點(diǎn)擊 Tools->Object Histogram ,打開(kāi)右邊的Object Histogram面板

2:在2處輸入我們的類全名,然后點(diǎn)3望遠(yuǎn)鏡搜索,在下面會(huì)顯示 我們的類,有三個(gè)實(shí)例

4:可以雙擊選中我們的類, 也可以放大鏡,可以打開(kāi)Show Objects of Type 面板 看到三個(gè)實(shí)例的詳情

其中第三個(gè),就是我們?cè)跅V锌吹降姆椒▋?nèi)的成員變量.

對(duì)于另外兩個(gè),需要通過(guò)反向指針查詢 ,看哪個(gè)類引用了這個(gè)實(shí)例,來(lái)看是哪個(gè)變量

HSDB使用revptrs 看實(shí)例引用

對(duì)于上面還有兩個(gè)地址, 我們不能確定是什么對(duì)象,所以我們可以通過(guò)指針?lè)床閬?lái)看他們被什么所引用,如下圖所示:

如何使用HSDB探秘運(yùn)行時(shí)數(shù)據(jù)區(qū)

如上圖,我們可以看到,一個(gè)被Class對(duì)象所引用, 是類靜態(tài)變量,一個(gè)被jvm/Main , 也就是我們Main類引用, 是類成員變量. 通過(guò)這個(gè)我們也可以總結(jié), 靜態(tài)變量,其實(shí)也是存在堆里面.

Class,static及Klass的關(guān)系

這個(gè)版本的hsdb 有些指令不支持,如mem , whatis等,所以要深入學(xué)習(xí)的小伙伴可以用jdk1.8的hsdb試下上述兩個(gè)命令

多個(gè)Java對(duì)象(Java Object,在堆中)對(duì)應(yīng)同一個(gè)Klass(在MetaSpace中)對(duì)應(yīng)同一個(gè)Class對(duì)象(在堆中), 類的靜態(tài)變量地址都存在Class對(duì)象的后面(所以也在堆中)。

上述內(nèi)容就是如何使用HSDB探秘運(yùn)行時(shí)數(shù)據(jù)區(qū),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI