当我们想要创建一个java.lang.Class类的实例(类对象)时,以下三种方法可供选择:

  1. Class.forName(“className”)
  2. MyClass.class
  3. obj.getClass()

假设我们有一个类com.hangl.Exam

【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】浏览器打开:qq.cn.hn/FTf 免费领取

ple,那么com.hangl.Example.class就表示该类的类对象。在ART中,该类对象的创建同时也是art::mirror::Class的实例化过程。

由于java.lang.Class继承于java.lang.Object,因此art::mirror::Class也继承于art::mirror::Object。所以一个art::mirror::Class对象在内存结构上也包含klass_monitor_字段。

以下是一个实际的art::mirror::Class的数据。同样,kClassWalkSuperkPrimitiveTypeSizeShiftShiftkPrimitiveTypeMask是art::mirror::Class的静态字段,因此不会存在于Java类对象中。

3. Java.lang.Object.class和java.lang.Class.class的关系

4. 实例字段的存储位置

前文提到,最简单的Java对象只占用8字节,里面存储了两个字段:klass_monitor_。这8字节也可以称为对象头,是每个对象都必须具备的。

大多数对象除了对象头以外,还需要存储类的实例字段。每个类的实例字段大小不一,其大小在Class加载阶段中的LinkClass时决定。这些实例字段紧随着对象头排列存储,因此一个对象的真实内存占用通常如下所示。


5. 静态字段的存储位置

一个类所具有的信息可以分为两部分,一部分是元数据,例如该类有多少个实例字段,多少个虚拟方法等,是描述性的信息。另一部分则是静态字段的值。元数据可以通过art::mirror::Class对象来表示,而静态字段将紧随其后。
这种内存结构和Java对象十分相似,上半部分是元数据,下半部分是字段值。只不过对象的元数据是klass_monitor_,而类的元数据是class_loader_methods_等。对象中的字段值是实例字段,类的字段值是静态字段。
不过需要注意一点,每个类的静态字段在内存中都是独一份,因此子类中不需要存储父类的静态字段。这和实例字段是不同的。
的静态字段在内存中都是独一份,因此子类中不需要存储父类的静态字段。这和实例字段是不同的。

ART虚拟机 _ Java对象和类的内存结构,java中级面试题库weixin相关推荐

  1. 快速带你分清java内存结构,java内存模型,java对象模型和jvm内存结构!

    现如今你是否有这样的感觉,无论生活还是学习,节奏都是非常的快,每天面对海量的知识信息,自己感觉都要hold不住了,每天打开微信公众号,是不是发现有几十条未读,无论是技术文章还是其他类型的文章,我们大多 ...

  2. java 句柄池_深入理解JVM之Java对象的创建、内存布局、访问定位详解

    本文实例讲述了深入理解JVM之Java对象的创建.内存布局.访问定位.分享给大家供大家参考,具体如下: 对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含 ...

  3. java 对象压缩_理解Java对象:要从内存布局及底层机制说起,话说....

    前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上一篇文章中我们说了Java的类和对象在JVM中的存储方式,并使用HSDB进行佐证,没有看过上一篇文章的小伙伴可以点这里:< 这篇文章主要 ...

  4. Java(4)---Java 对象和类

    Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例(对象不是找个女朋友 ...

  5. java对象添加字段_99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?

    在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的new语句之外,我们还可以通过反射机制.Object.clone方法.反序列化以及Unsafe.allocateInstance 方法来 ...

  6. Java对象运行时在内存中的情况

    Java对象运行时在内存中的情况 您可能已经知道,一旦创建了一个对象,它就只是堆中的一系列字节.您可能对Java对象在内存中的情况感到好奇吗? 1.变量 以下是"Base"(B)类 ...

  7. java 系统工具类 查询内存 CPU 系统基本信息 SysInfoUtils

    java 系统工具类 查询内存 CPU 系统基本信息 SysInfoUtils maven依赖 <dependency><groupId>com.github.oshi< ...

  8. [深入理解Java虚拟机]第六章 Class类文件的结构

    在本章关于Class文件结构的讲解中,我们将以<Java虚拟机规范(第2版 )> (1999年发布,对应于JDK 1.4时代的Java虚拟机)中的定义为主线,这部分内容虽然古老,但它所包含 ...

  9. java遍历一个类的属性名,java遍历对象属性

    java对象动态添加属性,Class对象和Java反射机制,java遍历对象属性,js对象动态添加属性 java 对象动态添加属性,Class对象和Java反射机制,java遍历对象属性,js对象动态 ...

最新文章

  1. ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'name' at row 1
  2. 13本干货书籍,百余篇原创来了
  3. python java 爬数据_如何用java爬虫爬取网页上的数据
  4. linux acl 权限 给任何用户或用户组设置任何文件/目录的访问权限
  5. 小程序---模板的引用与使用
  6. 【数据结构与算法】之深入解析“省份数量”的求解思路与算法示例
  7. angular指令监听ng-repeat渲染完成后执行自定义事件方法
  8. [LintCode] Simplify Path [字符串操作]
  9. python2编码问题解决了吗_Python2编码问题
  10. 网络存储 linux 访问,Linux基础教程学习笔记28——使用Samba访问网络存储
  11. python和mt4的区别_MT4和MT5最大的区别在哪里?
  12. Python Cheat Sheet 中文版
  13. C#硬件开发源码集合
  14. 英特尔傲腾驱动下载_什么是英特尔傲腾内存?
  15. 盘点各大厂商的活体检测服务,哪款更适合应用开发者?
  16. sprintf函数的用法linux,Linux 常用函数——sprintf函数
  17. html embed如何禁止自动播放,html embed用法
  18. 人工智能专家系统c语言,人工智能实验4三-专家系统.doc
  19. viper4android io错误,golang常用库之配置文件解析库-viper使用详解
  20. java添加边框_Java如何为边框添加标题?

热门文章

  1. (11)FPGA跨时钟域问题导致数据偶尔异常(学无止境)
  2. (58)FPGA面试题-只使用双输入NAND门,设计了一个四输入NAND门
  3. (96)FPGA PLL与MMCM区别?
  4. clickhouse mysql引擎_MySQL 最优秀的替代品系列之五:Clickhouse 视图的神奇用法
  5. STM32f407与STM32F103 串口采用DMA收发数据配置方法的异同
  6. nginx的模块化体系结构
  7. linux 设备驱动初学(一)
  8. cdev结构 and MKDEV
  9. ROS 教程之 network:多台计算机之间网络通信(2)
  10. python mssql bulk_SqlBulkCopy:批量插入SqlServer的利器