您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何使用HSDB探秘運行時數據區,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
HSDB全稱是HotSpotDebugger, HotSpot虛擬機的調試工具,在使用的時候,需要程序處在暫停的狀態,可以直接使用Idea的debug工具. 使用HSDB可以看到堆棧里面相關的內容,
無論哪種方式啟動,都需要先知道當前java程序的進程號,我們使用jps命令,如下圖所示:
然后我們使用命令 jhsdb hsdb --pid=87854
來啟動HSDB,如下圖所示:
我們知道,在創建一個線程時,都會有一個為之分配一個jvm棧,如上圖我們可以看到在java Threads中有5個線程,我們選中main線程,然后點擊上面的查看棧信息的圖標,如下圖所示:
1:在原java Threads面板上,點第二個按鈕,可召喚出Stack Memory for main 這個面板.
Stack Memory for main 面板主體有三大部分,如上圖所述
2:最左側是棧的內存地址
3:中間一列是該地址上存的值(大多是別的對象的地址),
4:最右側是HotSpot的說明
5:在右側的說明中, 我們可以此時棧中有兩個棧幀(Frame)
大家看到 Young com/platform/tools/jvm/Main$TestObject 這個我們定義的對象,記住這個地址0x00000001161d11e0
代表這個對象是在棧中被引用
我們的對象大都是在堆里面,我們可以借助HSDB看堆中有多少個實例對象,如下圖所示
1:點擊 Tools->Object Histogram ,打開右邊的Object Histogram面板
2:在2處輸入我們的類全名,然后點3望遠鏡搜索,在下面會顯示 我們的類,有三個實例
4:可以雙擊選中我們的類, 也可以放大鏡,可以打開Show Objects of Type 面板 看到三個實例的詳情
其中第三個,就是我們在棧中看到的方法內的成員變量.
對于另外兩個,需要通過反向指針查詢 ,看哪個類引用了這個實例,來看是哪個變量
對于上面還有兩個地址, 我們不能確定是什么對象,所以我們可以通過指針反查來看他們被什么所引用,如下圖所示:
如上圖,我們可以看到,一個被Class對象所引用, 是類靜態變量,一個被jvm/Main , 也就是我們Main類引用, 是類成員變量. 通過這個我們也可以總結, 靜態變量,其實也是存在堆里面.
這個版本的hsdb 有些指令不支持,如mem , whatis等,所以要深入學習的小伙伴可以用jdk1.8的hsdb試下上述兩個命令
多個Java對象(Java Object,在堆中)對應同一個Klass(在MetaSpace中)對應同一個Class對象(在堆中), 類的靜態變量地址都存在Class對象的后面(所以也在堆中)。
上述內容就是如何使用HSDB探秘運行時數據區,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。