JDK中提供了命令行下的斷點調試工具:JDB。它可以調試正在運行或未運行的Java程序。
現在我們編寫一個Java程序
public class Hello {
private String s0 = "private";
public String s1 = "public";
public static String s2 = "static";
public static final String s3 = "static final";
public static void main(String[] args) {
String s4 = "local";
String s5 = new String("local");
s5.intern();
System.out.println(s4 == s5);
}
}
編譯生成Hello.class文件。
然後命令行運行jdb:
jdb Hello
可能會出現類似下面的錯誤。
錯誤信息中,address=lslxy1021:38885引起了我們的注意。
查看hosts文件:
將lslxy1021所在行註釋,問題解決。
JDB 調試
(不清楚命令的可鍵入 help 查看幫助信息)
首先在main方法上設置一個斷點:
- stop in Hello.main
- 運行程序至斷點處:run
- 運行下一行:next
這裏我們先next到這裏停止。
HSDB查看內存佈局
新開一個窗口,首先獲取剛纔程序的pid。
運行jcmd -l,得到pid爲269837。
接下來通過HSDB查看內存佈局(針對JDK 9+版本,JDK 8中啓動方式略有不同)
命令行輸入命令:jhsdb clhsdb(clhsdb即hsdb的命令行版)
輸入universe命令查看GC堆的地址範圍和使用情況
輸入scanoops start end type 查詢指定類型(包括派生類),我這裏輸的命令是scanoops 0x00000000e3400000 0x00000000ee150000 java.lang.String,結果掃描出來的有點多。。。
我們可以用findpc address命令查看某個地址分配在哪個區域中,用inspect命令查看具體某個地址中的內容。