Java 对象解析

Java对象解析

String str = new String();

相信很多人都这么new过一个对象,从你的逻辑角度来看这个对象其实代表一个String的实例。但是物理上他存储了什么样的信息呢?

接下来分析一下

首先假设str是一个局部变量,这个变量按照JVM+JDK1.8的模型的话是存储在JVM中的Java栈中。而且每一个Java方法的执行到结束都对应着Java栈里面一个栈帧的出栈入栈的过程。str存储在一个栈帧中,这个栈帧存储了一个地址,程序运行时可以根据这个地址找到这个地址指向的对象。也就是你new出来的那个对象。

而你new出来的哪个对象是怎么跟这个变量对应上的呢

一个局部引用类型的对象在内存中存储的位置是堆,如果你觉得你不好判断局部对象局部变量成员变量成员对象存储在JVM虚拟机的哪个位置的话你可以参考一下另外一个博客。https://blog.csdn.net/Lcxy_Demo/article/details/81176314 这里附上链接

然后言归正传我们的目的是分析对象的内容

对象包括三部分:1、对象头。2、实例数据。3、对其填充部分

1、对象头:对象头包括了两部分,运行时的数据与类元数据指针。名字一听怪复杂怪奇葩,但是这个运行时的数据大家应该能看明白啥意思我就不多解释,运行时的数据内容包括:HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程id、偏向时间戳等等 。然后这个类元数据指针的话是什么呢,元大概说的是最初刚开始的意思,类元数据指针指向的是这个对象所属的那个类。每一个类都会new出来一个或者多个实例,实例=对象,每一个对象都会知道自己是属于哪个类的,这就是因为这个类元数据指针。虚拟机有很多种,JVM并不是只有一种,我们常用的有hotspot,其他的虚拟机可能会因为结构的不同会使用不同的对象结构。这个就不太清楚了。

2、实例数据:对象实例数据部分存储的是真正的对象数据,真正的有效信息,当你debug的时候你能看出一个对象成员属性的值,无论是从父类继承下来的还是在子类中新定义的,他总会存在的。

3、对其填充:这个对其填充的内容并不是一定存在的,他可能不存在。主要是为了补齐你的对象内容。大概可以理解为占位符。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值