java jvm对象_Java对象在JVM中长啥样

前言

Java 是门面向对象的开发语言,那么我们自己编写的 Java 类生成的对象是什么样的?它肯定保存在虚拟机的内存中,但它以怎样的结构来保存的呢?带着疑问往下看看。

关于Klass

Java 层的开发可能不太熟悉 Klass,但肯定熟悉 class,我们只要知道 Klass 是 class 在 JVM 中的表示即可,即 Java class 对应 JVM Klass。C++ 中的继承关系如下:

class MetaspaceObj

class Metadata

class Klass

Klass 类用来描述 Java 类信息,包括描述类型自身布局、类名、父类、子类、兄弟类等等。

关于oop

按前面 class 对应的方式,那么对象也应该有 JVM 内部与之相对应的表示吧?没错,就是 oop(ordinary object pointer),普通对象指针。它的定义如下:

typedef class oopDesc* oop;

其中 oopDesc 类是所有 oop 的基类。在 JVM 中,不同的 oop 用于描述特定类型的对象。比如类对象用 instanceOopDesc,数组用 arrayOopDesc。

Klass+oop模型

Java 对象在 JVM 中的结构如下,包括 header 和对象内容。如下图中,左边的是 instanceOopDesc,即一般的类对象,header 包括了标识和元数据,标识用于存储运行时记录信息,包括哈希码、GC锁和线程锁等等。而右边的为 arrayOopDesc,即数组对象,header 多了个 length,用于记录数组长度。

来个demo

public class Test {

private String[] flag = { "a", "b", "c" };

private String name = "test";

public static void main(String[] args) throws Exception {

Test test = new Test();

String _name = "test";

System.out.println(test.flag);

System.out.println(_name);

}

}

查看 main 线程的栈内存,我们主要是要拿到 Test 对象的地址,即0x000000008a105dd0。

接着用 inspector 来查看0x000000008a105dd0地址对应的 oop,看到这个 oop 就是我们的 Test 类生成的对象结构了,包含了 mark 和 metadata。这里可能会有个疑问,就是前面不是说数组还有一个 length 来表示数组长度的吗?但图中的 flag 数组变量并没有看到 length 啊。

其实数组 oop 并不是没有 length,而是 C++ 并没有声明这个变量,而是通过指针来直接将数组长度保存到对应的内存了,所以这里是看不到的。通过下面具体的实现代码就能清楚了解到原因了。是不是我们就没办法看到这个长度值呢?并不是,下面继续看如何来看这个值。

int length() const {

return *(int*)(((intptr_t)this) + length_offset_in_bytes());

}

void set_length(int length) {

*(int*)(((intptr_t)this) + length_offset_in_bytes()) = length;

}

前面我们可以得到 flag 数组 oop 的地址为0x000000008a105de8。64位机器上_mark为8字节,_metadata为4字节,那么将地址加12,得到0x000000008a105df4。然后用 hsdb 命令行的 examine 得到地址的值,得到0x8a105e0800000003,其中00000003便是。

原文作者:超人汪小建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洪小文:以科学的方式赤裸裸地剖析人工智能

来源: 微软研究院AI头条 概要:要想在未来实现人工智能这项“新”技术的最大化利用,必须清楚认识到人工智能到底是什么,过去我们做了什么,今天能做什么,未来又能有什么新的发展可能。 近两年来,人…

java ee ide 添加spring,如何在Eclipse IDE项目文件夹中为spring添加jar文件

I am going to start MVC with Spring framework, but I am unable to get jar file of spring framework .I have tried in help menu>install new software>add new in Eclipse IDE but I failed. Can anyone please guide me ?解决方案You can try download STS (Spr…

人工智能如何驱动实体经济?六大领域展望

来源:腾讯研究院 概要:科技进步正在成为推进经济发展的重要推动力,对中国经济发展的贡献率已经上升到56.2%。面对正在兴起的人工智能浪潮,如何占据行业发展制高点,如何促进与实体经济深度融合,形成新增长点…

《浪潮之巅》作者吴军最新演讲:超级人工智能

来源:亿欧 概要:10月22日,AMINO硅谷中国“新”大会在南京经济技术开发区举行。《浪潮之巅》作者、AMINO资本合伙人吴军发表了以《超级人工智能》为主题的演讲。 人工智能起源 我知道很多人都想听我讲人工智能是怎么回事儿?最近有…

mysql慢sql增加读写分离_MySQL主从同步+读写分离

MySQL主从同步读写分离实验拓扑:三台mysql数据库:192.168.80.101 主服务器 mysql192.168.80.102 从1服务器 mysql192.168.80.103 从2服务器 mysql192.168.80.104 调度器Amoeba服务器 jdk、amoeba192.168.80.105 mysql客户端 mysql第一部分:三…

Google公布OpenFermion:量子计算机的开源软件包

来源:转载自公众号「雷克世界」微信号:ROBO_AI 作者:Ryan Babbush、Jarrod McClean 编译:嗯~阿童木呀、多啦A亮 概要:OpenFermion是一个用于模拟电子(费米子)相互作用系统的库,它能够…

java 类集合_java集合类详解

一、集合类与数组的区别1.集合的长度可变,数组的长度固定;2.集合用来存放对象引用,数组用来存放基本类型的数据;二、集合类的关系1.Collection接口存储一组不唯一、无序的对象。2.List接口存储一组不唯一、有序(插入顺序)的对象。…

英特尔宣布推出“Nervana”神经网络处理器

原作者:Ryan Whitwam 译者:彭婷 概要:Nervana NNP就是基于这种计算设计的。这也是所谓的专用集成电路(ASIC),所以它无法应用于一般的计算任务。 科幻小说家和现代科技大型公司一致认为AI可以开辟出一条康庄…

java爬取button_学习使用Java的webmagic框架爬取网页内容

(一)使用前的配置:2,(1)添加依赖:us.codecraftwebmagic-core0.7.3us.codecraftwebmagic-extension0.7.3us.codecraftwebmagic-selenium0.7.3(2)从GitHub官网下载webmagic的压缩包(https://codeload.github.com/code4craft/webmagic/zip/maste…

异构智能吴韧:物联网是“伪命题”?智联网才是未来

概要:“咨询机构预测,在未来人工智能的市场上12%的比例的资金将用在人工智能芯片上。”吴韧表示,异构智能瞄准的就是人工智能本地芯片市场。 Novumind异构智能(以下简称异构智能)在火热的人工智能新闻里出现的次数屈指…

java栈编程题_Java实现栈和队列面试题

面试的时候,栈和队列经常会成对出现来考察。本文包含栈和队列的如下考试内容:(1)栈的创建(2)队列的创建(3)两个栈实现一个队列(4)两个队列实现一个栈(5)设计含最小函数min()的栈,要求min、push、pop、的时间复杂度都是O(1)(6)判断栈的push和p…

联合国《2017年信息经济报告》

来源:联合国 概要:数字经济已经深入到了人们生活的衣食住行等所有方面,其发展速度和方式超出人们的想象。数字经济将把人类带往何方?这还是一个难解的谜题。 数字经济已经深入到了人们生活的衣食住行等所有方面,其发展…

java链表list_java自定义List链表

第一步:定义一个List接口,规定一些基本操作package my.stack;public class Node {private T data;private Node next;public Node(){data null;next null;}public Node(T data){this.data data;this.next null;}public Node(T data, Node next){this…

Amazon、Google、 Microsoft和IBM如何将人工智能作为一项服务出售

译者:李凌 概要:Alphabet、Amazon和Microsoft这几家公司都发现,在产品中植入人工智能后能让产品变得更加优秀,他们可以将这种做法转变成一项服务,然后作为一种基于蓬勃发展的云计算业务的增值服务出售给企业客户。 云计…

java炸弹人素材_炸弹人图片_炸弹人模板_炸弹人设计素材下载

[{"id":658285,"url":"https://www.tooopen.com/view/658285.html","title":"英雄联盟全员高清游戏壁纸海报图片素材","imgthumb":"http://img05.tooopen.com/images/20140711/tooopen_sl_010800932879.jpg&…

CB Insights发布2017全球AI企业100强,出门问问、碳云智能入选

来源:亿欧 概要:在美国加州圣芭芭拉举办的创新峰会(TheInnovation Summit)上,CB Insight的CEO Anand Sanwal揭晓了全球2017 AI100名单,评选出全球最有创新实力的100家AI公司,国内公司出门问问、…

Java树形转扁平_js把树形数据转成扁平数据

我就直接上代码了都是实际项目里面用到的1.假设这个json就已经是树型结构数据了(如果不知道怎么实现树型结构数据请看我另一篇博客)var compressedArrafcommon.treeDataToCompressed(json);/*******************************JS封装好的方法***********************************…

定位AI交互技术服务商,声智科技完成近亿元A轮融资,将拓展安防、汽车等新场景

来源:36Kr 摘要:“语音交互是人工智能相关技术的重要应用场景,而语音交互的核心和关键突破点在于远场。而国内真正有实力做好远场技术的团队是非常稀少的。” 定位人工智能交互技术服务商的声智科技(SoundAI)&#xff…

java http超时重连_httpclient 重连机制

我们在进行http请求时,难免会遇到请求失败的情况,失败后需要重新请求,尝试再次获取数据。Apache的HttpClient提供了异常重试机制,在该机制中,我们可以很灵活的定义在哪些异常情况下进行重试。今天有个小伙伴&#xff0…

德国电信:5G有重复3G命运的风险!

来源:5G 摘要:德国电信:5G有重复3G命运的风险! 行业深度观察