首页 > 编程语言 >借助HSDB查看Java类对应的klass模型

借助HSDB查看Java类对应的klass模型

时间:2022-08-17 15:51:48浏览次数:94  
标签:Java HSDB C++ 对应 klass JVM Hello

问题一:Java的每个类被加载到JVM中,他们对应的C++类是什么?

答:klass模型

问题二:在JDK8中,Java类存储在方法区还是堆区?

普通的Java类,在JVM中对应的C++类是InstanceKlass,存储在方法区(String)

Java类对应的Class对象,在JVM中对应的C++类是 InstanceMirrorKlass,存储在堆区(String.class)

基本类型包括 boolean、byte、char、short、int、long、float、double,
如果是基本类型数组,在JVM中对应的C++类是 TypeArrayKlass
如果是引用类型数组,在JVM中对应的C++类是 ObjArrayKlass

创建一个Java测试类并运行:

public class Hello {

  private int a = 10;
  private static int b = 20;

  public static void main(String[] args) {
    int[] intArr = new int[1];
    Hello[] refArr = new Hello[1];
    Class<Hello> clazz = Hello.class;

    while (true);
  }
}

接下来,启动HSDB并连接到Hotspot进程 点击了解更多

完成 Attach to Hotspot process如何通过HSDB查看一个Java类对应的C++类呢?

方式一类向导 Class Browser

对于非数组,我们可以用类向导来查看它的klass模型
数组在 Class Browser 中是找不到的,因为数组是运行时动态创建的,没有真正的实体,因此使用类向导找不到。

选择顶部菜单栏 Tools | Class Browser,并找到类 Hello 对应的内存地址 0x0000000100060828 并复制下来:

接着再次选择顶部菜单栏 Tools | Inspector,在 Address / C++ Expression 后面输入 Hello 对应的内存地址 0x0000000100060828,然后键盘按下回车。

方式二通过对象

通过线程找到对应的栈帧,查看对象 oop 模型,查看 klass pointer

完成 Attach to Hotspot process,默认会弹出一个 Java Threads,点击 main 达到选中效果(该行蓝色背景区别于未选中的行),接着点击下图红框中的 Stack Memory 按钮:

打开的 Stack Memory for main 对话框,显示的 main 线程的栈帧:

对象首地址 C++类 局部变量名 Inspector
0xa3cf4878 oop clazz
0xa3cf6d60 ObjArray refArr
0xa3cf6ce0 [I intArr
0xa3cf6cd0 ObjArray args

[I 这个是 java描述符
_metadata._compressed_klass 对应的就是类型指针 klass pointer

标签:Java,HSDB,C++,对应,klass,JVM,Hello
From: https://www.cnblogs.com/kendoziyu/p/16593202.html

相关文章

  • java 携带session 前台传递cookie 跨域解决方案 vue + java
    前台axios设置withCredentials:true后台设置header("Access-Control-Allow-Origin","源地址";header("Access-Control-Allow-Credentials","true");这里源地址......
  • 【Java基础】8种基础数据类型和String类型
    变量必须先声明,后使用1.变量分类(1)按数据类型分(2)按声明的位置分2.基本数据类型和String类型(1)整型整型占用存储空间byte1字节=8bitshort2字节int4......
  • Java面试知识点总结(二)
    字符串&集合面试题汇总一、Java中操作字符串都有哪些类?它们之间有什么区别?操作字符串的类有:String、StringBuffer、StringBuilder。String和StringBuffer、StringBu......
  • java stream List<List<Object>> 转List<Object>
    以下几种方法都可以private<T>List<T>mergeOne(Stream<List<T>>listStream){returnlistStream.flatMap(List::stream).collect(toList());}private<T>Lis......
  • Javaweb09-请求跳转项目 分页条件查询 + 增删改 + 邮件登录
    1、Jar包<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven......
  • JAVA环境安装
    1.工具下载  下载JDK:https://www.oracle.com/java/technologies/downloads/#jdk18-windows    下载完成后点击安装一直“下一步”即可(其中可选择安装路径)  ......
  • java double精度丢失
    问题很简单,是由于我们输入的十进制的double类型的数据在进行计算的时候,计算机会先将其转换为二进制数据,然后再进行相关的运算。然而在十进制转二进制的过程中,有些十进制......
  • 【Java面试】如果一个线程两次调用start(),会出现什么问题?
    “如果一个线程两次调用start(),会出现什么问题?”如果这个问题出自阿里p6岗位第一面的提问,你能回答出来吗?大家好,我是Mic,一个工作了14年的Java程序员。关于这个问题,涉及......
  • java 树结构构建
    importio.swagger.annotations.ApiModel;importio.swagger.annotations.ApiModelProperty;importjava.util.ArrayList;importjava.util.List;/***组织树*/@ApiMo......
  • Java初学易错点(day1)
    1.重写方法时,方法名一致,参数不一致,为重写(专业点叫重载)。2.重写的方法,可以和之前的方法共同存在(部分语言不好理解的点,会erlang的应该能理解)。 3.就近原作和和this。......