JVM(一):Klass模型

一、 前言

学习类的加载能帮助我们了解我们写的java类如何加载到JVM内存中以及整个生命周期,使我们知其所以然,明明白白写代码。

二、Klass模型

在学习类加载之前先介绍一下Klass模型,Java的每个类,在JVM中,都有一个对应的Klass类实例与之对应,存储类的元信息如:常量池、属性信息、方法信息。JVM底层是用C++实现的,简单总结Klass是java类在C++中的表现形式

在这里插入图片描述

1. MetaspaceObj

所有klass类的顶层父类

2. MetaData

MetaspaceObj有个子类是MetaData

3. klass

MetaData有个子类叫klass

4. InstanceKlass

klass的子类,存储普通java类的元信息。对应普通的java类,jvm内部使用的类, 存储在方法区也就是元空间,该类保存类的元信息,有三个子类为InstanceMirrirKlass、InstanceRefKlass、InstanceClassLoaderKlass

小贴纸:
方法区是jvm的规范,元空间是HotSpot的具体实现

  • InstanceMirrirKlass: jvm暴露给程序使用的类, 存储在堆区,用来表示java.lang.Class,也就是说我们java代码中使用反射机制获取到的Class对象就是这个实例,它是存储在堆区的,而上面说的InstanceKlass是jvm内部使用的,它是存储在方法区也就是元空间。java类中的静态变量会存储在instanceMirrorKlass类中,instanceMirrorKlass类里面比instanceKlass类多定义了一个静态字段偏移量的属性,可以通过该属性获取静态变量。
  • InstanceRefKlass: 用于表示java.lang.ref.Reference的子类,也就是强软弱虚引用。
  • InstanceClassLoaderKlass: 用于遍历某个加载器加载的类,描述类加载器的实例。

5. Arrayklass

klass的子类,存储数组类的元信息, 存储在方法区也就是元空间。有两个子类TypeArrayKlass、ObjArrayKlass。

  • TypeArrayKlass: 描述java基本数据类型的数组,存储在堆中
  • ObjArrayKlass: 描述java引用类型的数组,存储在堆中
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值