使用jhsdb查看JVM堆中對象的分配

總結一下運行<<深入理解Java 虛擬機>>書中的例子過程中遇到的問題。

環境準備

  • 安裝JDK11
    JDK 11下載地址
    https://aws.amazon.com/cn/corretto/
    點擊下載 Amazon Corretto 11在這裏插入圖片描述
    根據各自的平臺選擇相應的JDK,我是在win10上安裝,所以選擇的是Windowsx64
    在這裏插入圖片描述
    下載完成後安裝,安裝的過程比較簡單,不會的可以自行去網上查。

  • 配置環境變量
    新建JAVA_HOME環境變量,路徑爲JDK11安裝的根目錄
    在這裏插入圖片描述
    新建classpath環境變量,將路徑設置爲%JAVA_HOME%\lib
    在這裏插入圖片描述

配置Path環境變量,新建一個環境變量將路徑設置爲%JAVA_HOME%\bin
在這裏插入圖片描述

  • 編寫測試代碼
public class JHSDB_TestCase {
	static class Test {
		static ObjectHolder staticObj=new ObjectHolder();
		ObjectHolder instanceObj=new ObjectHolder();

		void foo() {
			ObjectHolder objectHolder=new ObjectHolder();
			System.out.println("done");
		}
	}

	private static class ObjectHolder {

	}

	public static void main(String[] args) {
		Test test=new JHSDB_TestCase.Test();
		test.foo();
	}
}

運行測試程序,使用jhsdb查看對象在堆中的分配

  • 調試模式運行
    配置JVM運行參數
    在這裏插入圖片描述
    運行程序提示 “無效的源發行版11”
    在這裏插入圖片描述
    修改Idea Project Structure中的Module SDK
    在這裏插入圖片描述
    再次debug運行測試程序
    在這裏插入圖片描述
  • 查看進程ID
運行 jps -l

在這裏插入圖片描述

  • 使用jhsdb命令連接JVM進程
運行 jhsdb hsdb ---pid 23508 連接到JVM進程

提示不能確定我的JVM版本
在這裏插入圖片描述

  • 查看JDK的版本
java -version

在這裏插入圖片描述
因爲的我的機器上安裝了多個JDK,雖然我配置的環境變量爲JDK11,但是程序使用的是JDK8,JDK11的環境變量沒有生效

解決辦法

  • 查找java所在的目錄
運行 where java

在這裏插入圖片描述
從上圖中可以看出java.exe文件有三個,將JDK11中的java.exe替換ProgramData\Oracle\Java\javapath目錄下的java.exe
在這裏插入圖片描述
在這裏插入圖片描述

  • 運行jps 查看進程ID
    在這裏插入圖片描述
  • 運行jhsdb
jhsdb hsdb --pid 28344

在這裏插入圖片描述
在這裏插入圖片描述

  • 查看堆中的變量
    選擇Tools->Heap Parameters,可以看到JVM堆新生代、老年代大小,已經使用及地址的範圍
    在這裏插入圖片描述

未完待續

參考
https://www.cnblogs.com/blog-zy/p/9364159.html
<<深入理解Java虛擬機>>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章