专栏首页EffectiveCodingJVM 《七 JVM 角度看对象》

JVM 《七 JVM 角度看对象》

作为一个Java 程序员,天天与我们交互的除了逻辑就是对象了,我们可以自己new一个,也可以注入一个,得到对象的方法儿有很多。

这个对象有自己的属性、方法。然后 我们就可以利用这些对象的行为来完成我们的逻辑了。这是对象站在我们的角度时的样子。那在JVM或者计算机看起来是什么样子呢。

一、

首先,这是个对象。JVM也知道这是个对象,会给它一个标示。

也就是所谓的高大上的mark word&一些指针信息,说白了也就是存储一部分信息的标示头。

那这个mark中有什么呢?

一部分是 对象运行时的一部分数据 比如:hashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳。

然后是 一些类型指针。这个是用来指向它所属的类的。

如果你现在正在学习Java 并发相关的内容,mark word 这部分的内容还是值得好好看一看的,出了Mark Word的结构,还有如何基于这个东西来实现那些个高级锁。我们使用的的锁,为什么能锁呢,对象锁? 锁?这类的问题这一块都值得好好看看。

还有类对象挺特殊,Java 数组。

在普通的对象中,我们有一个记录对象大小的字段(显然对象产生时大小已经就是确定的了)。但是数组对象不确定啊,我们需要一个字段来标示该数组的元素个数~

二、

要说的对象的下一部分。

实例数据,就是这个对象中所包含的数据。没别的 就这样

三、

对齐填充

嗯,对齐填充

这样一个对象的结构就很清晰了

然后前面提到了对象大小的问题,我们都很清楚对象包含的其他对象,其实仅仅是存储了一个引用而已。那这个被包含的对象属于我们这个对象的大小计算吗?

这里说明一下,对象的大小是分为两种的: shallow size 、deep size

shallow size 是只算本对象内部内容的大小

deep size 是自身大小加上递归引用所有对象大小的总和

然后说起引用了,放两张老图,看看经典的样子

image.png

image.png

这样在JVM中的对象已经描述的差不多了。

其实呢这个是以 hotspot 为例来阐述的,其他的JVM会有一定的偏差不过明白运作原理、举一反三才是最重要的吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从JVM角度看看Java的clone操作

    欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。 最近在给熔断器组件增加一个降级策略(Hystri...

    慕容千语
  • Java技术专题之JVM逻辑内存回收机制研究图解版

    JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制。

    数据饕餮
  • JVM--对象回收

    Java运行时数据区包括:程序计数器、虚拟机栈、本地方法栈、Java堆和方法区。这里面程序计数器、虚拟机栈和本地方法栈是线程私有的,当线程结束或者方法退出时其内...

    SuperHeroes
  • JVM--对象创建

    虚拟机遇到一条new指令时,首先去检查这个指令的参数是否能在常量池中定位到一个符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,就必...

    SuperHeroes
  • JVM对象分配和GC分布【JVM】

    最近在学习java基础结构,刚好学到了jvm,总结了以下并可以结合思维导图认识以下Jvm的对象:

    简单的程序员
  • JVM《 零  JVM 相关简介&内存模型》

    提起Java,我们首先想到的是Java 语言。其实Java 是包括Java 语言、Java虚拟机规范两部分的。Java 不赘述,要说的是JVM, 即 Java ...

    邹志全
  • jvm对象的访问

    在 HotSpot虚拟机中,对象在内存中存储的布局分为三块区域:对象头,实例数据,和对齐填充。

    海向
  • JVM-解密Java对象

    在Java程序运行过程中时时刻刻都有对象被创建出来,对象的创建方式有很多种,最常见的就是new,其次还有clone和反序列化。下面我们一起来解密对象的创建、内存...

    shysh95
  • JVM的对象和堆

    上次博客,我们说了jvm运行时的内存模型,堆,栈,程序计数器,元空间和本地方法栈。我们主要说了堆和栈,栈的流程大致也说了一遍,同时我们知道堆是用...

    FunTester

扫码关注云+社区

领取腾讯云代金券