使用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虚拟机>>

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