首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 对象内存

平常工作中,我们只new一个对象,却基本不关心这个对象到底占了我们多少空间....今天就一起看下,对象的空间占用情况 首先,内存中的对象是由以下几部分构成的: 结合上图以下类为例,看下内存空间的占用情况 public class MyObject { int i = 123...对齐补全: JVM中开辟的内存空间必须是8字节的倍数, 如果缺少位数,需要补全为8的倍数; 以上各字段共28字节,需补全4字节 所以MyObject对象共占用8+4+0+16+4=32字节 下面利用openjdk...提升执行效率 头部空间补全 在关闭指针压缩之后,在看数组对象内存空间,就可以发现产生了数据补全的情况 Mark down使用8字节 Klass pointer 使用8字节 数组长度 使用4字节 头部数据补全.../A Instance size: 40 bytes Space losses: 4 bytes internal + 0 bytes external = 4 bytes total 以上,就是一个对象内存的占用情况

23910

Java对象内存布局

Java对象内存布局 一个Java对象内存中包括三部分 对象头 实例数据 补齐填充 [在这里插入图片描述] 对象对象头又分为以下三部分 Mark Word:Mark Word存储了对象的hashCode...在32位系统占4字节,在64位系统中占8字节; Class Pointer:用来指向对象对应的Class对象(其对应的元数据对象)的内存地址。...Length:如果是数组对象,还有一个保存数组长度的空间,占4个字节; 对象内存分布图 [在这里插入图片描述] 对象实际数据 对象实际数据包括了对象的所有成员变量,其大小由各个成员变量的大小决定,,比如...[在这里插入图片描述] 对齐填充 Java对象占用空间是8字节对齐的,即所有Java对象占用bytes数必须是8的倍数。...如何打印Java对象内存布局 org.openjdk.jol jol-core</artifactId

1.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java对象内存布局和对象

    Object obj = new Object(); //new 一个对象,占内存多少?...没有实例数据的话,就是16个字节 1、对象内存布局 在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding...) 2、对象在堆内存中的存储布局 Mark Word:对象标记 Class Pointer:类元信息(又叫类型指针) 对象内部结构分为:对象头、实例数据、对齐填充(保证8个字节的倍数,8、16、24...这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。...http://openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html http://hg.openjdk.java.net/jdk8u/jdk8u

    50220

    面向对象Java开发——对象内存原理和内存

    在使用Java开发时,面向对象是重点和难点,而要理解面向对象的问题,最重要的还是要搞清楚其在内存中的原理和内存图,本文记录了Java对象内存中的情况,包括this,基本数据类型和引用数据类型以及局部变量和成员变量的原理...目录 预备知识 一、一个对象内存图 二、多个对象内存图 注意 三、两个引用指向同一个对象内存图 四、this的内存原理 五、基本数据类型和引用数据类型的区别 六、局部变量和成员变量的区别 ----...一、一个对象内存图 创建一个对象,要经历以下7个步骤 加载class文件 申明局部变量 在堆内存中开辟一个空间 默认初始化 显示初始化 构造方法初始化 将堆内存中的地址值赋值给左边的局部变量 比如说运行代码...二、多个对象内存图 同理,如果要处理不止一个对象,那么也来举个例子,比如说有两个对象,只要出现new,就说明要创建一个对象,在堆空间内开辟块空间,创建几个就开辟几块,且相互独立。...,也能通过001也能找到堆内存的空间,相当于就是两个变量都指向了同一个对象

    86220

    JVM内存结构、Java内存模型和Java对象模型

    比如本文我们要讨论的JVM内存结构、Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。...3、不同版本的方法区所处位置不同,上图中划分的是逻辑区域,并不是绝对意义上的物理区域。因为某些版本的JDK中方法区其实是在堆中实现的。 4、运行时常量池用于存放编译期生成的各种字面量和符号应用。...这里就不对Java内存模型做更加详细的介绍了,想了解更多的朋友可以参考《Java并发编程的艺术》。 Java对象模型 Java是一种面向对象的语言,而Java对象在JVM中的存储也是有一定的结构的。...这就是一个简单的Java对象的OOP-Klass模型,即Java对象模型。 总结 我们再来区分下JVM内存结构、 Java内存模型 以及 Java对象模型 三个概念。...JVM内存结构,和Java虚拟机的运行时区域有关。 Java内存模型,和Java的并发编程有关。 Java对象模型,和Java对象在虚拟机中的表现形式有关。

    1.2K32

    承前启后,Java对象内存布局和对象

    承前启后,Java对象内存布局和对象头大家好,我是小高先生。在我之前的一篇文章《并发编程防御装-锁(基础版)》中,我简要介绍了锁的基础知识,并解释了为什么Java中的任何对象都可以作为锁。...在那里,我提到了对象头中有一个指向ObjectMonitor的指针,但没有深入探讨Java对象内存结构。...本文将引导大家深入了解Java对象内存布局以及对象头结构,帮助大家更好地理解Java中的对象和锁,并为之后学习synchronized和锁升级打下基础。new Object()怎么理解?...JOL有关Java对象布局的理论知识已经学完了,那能不能从代码层面验证一下对象的结构呢。JOL(Java Object Layout)是一个专门用于分析Java虚拟机(JVM)中对象内存布局的工具箱。...总结本文和朋友们一起学习Java对象内存布局的知识,对象对象头、实例数据和对齐填充组成。

    17810

    java基础_面向对象_内存分析

    Hello小伙伴们~今天兔妞兔君都好忙,所以给大家分享的是同事帅GG的投稿呢~主要讲的就是面向对象的设计思想、Java中类和对象的定义以及类加载的内存分析。 面向对象的设计思想 ?...首先说明一点,面向对象Java的重中之重,面向对象的设计思想本身不是特别难理解但是想要用的特别好,需要长时间的锤炼才行。那么面向对象到底是啥?...类和对象的关系:类可以看成一类对象的模板,而对象可以看成该类的一个具体实例。 类与类之间是有这不同的关系,是Java体系中最常见的知识。 继承:一般和特殊的关系。...类加载的内存分析 ? Java中的对象是通过引用对其操作的。理解了内存就理解了一切。先看最简单的代码: String s ;//声明了一个String类型的应用变量。但并没有使它指向一个对象。...补充:构造函数 使用new+构造方法创建一个新的对象 构造函数是定义在Java类中一个用来初始化对象的函数。 构造函数与类同名且没有返回值。

    44810

    Java 对象占用内存大小

    Java 对象 如果想要了解java对象内存中的大小,必须先要了解java对象的结构。...HotSpot虚拟机中,对象内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding) java 对象头 Mark Word HotSpot...Class Metadata Address 存储该对象的 Class 对象的地址。就是该对象属于那个Class。 ArrayList 存储数组的长度。 如果是数组对象才会有此数据。...Java 对象大小分析 下面我们以 64 位的 JDK 进行分析 Java 对象在堆中的占用空间大小 代码示例一 public class StrObj1 { private String a;...System.gc(); } } 运行程序 java -XX:+HeapDumpBeforeFullGC -XX:HeapDumpPath=D:\hprof\test2.hprof -XX:-UseCompressedOops

    2.3K60

    四、Java对象内存布局

    在HotSpot虚拟机中,对象内存中的布局划分为3个区域:对象头(Header),实例数据(Instance Data)以及对齐填充(Padding)。...对象头 HotSpot虚拟机对象对象头一般包含两部分信息。 第一部分用于存储对象自身的运行时数据,例如HashCode、GC分代年龄等信息。...另外,如果对象是一个Java数组,那么对象头中还必须有一块用于记录数据长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数据的元数据中却无法确定数据的大小。...实例数据紧随对象头,为了提高存储空间的利用率,这部分数据的存储顺序会受到虚拟机分配策略参数(FieldsAllocationStyle)和字段在Java源码中定义顺序的影响。...由于HotSpot虚拟机的自动内存管理系统要求对象的起始地址必须是8字节的整数倍,换句话说,就是对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数(1倍或两倍)。

    92730

    Java虚拟机--对象内存布局

    对象中的数据 前两篇,我们讲到了Java对象的类加载,Java对象的初始化操作。...本篇,我们来继续学习Java对象,看看Java对象内存中如何布局,看看Java对象中由哪些数据构成,以及教给大家如何测量一个对象的大小。...HotSpot虚拟机下,一个对象内存中包含了3大区域,分别为:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。...值得注意的是,如果对象是一个Java数组,那在对象头中还必须有一块区域用于记录数组的长度,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中无法确定数组的大小。...原生类型(primitive type)的内存占用如下: 原生类型 占用内存大小(字节) boolean 1 byte 1 short 2 char 2 int 4 float 4 long 8 double

    90560

    详解 Java 对象内存控制(下)

    把 d1 赋值给 b3,但是 b3 的类型是 Base,这意味着 d1 和 b3 指向了同一个 Java 对象,如果在程序中判断 d1 == b3,将得到 true,但是访问 b3.count 得到2,...访问 d1.count 得到 20,这说明:在 b3 和 d1 指向的 Java 对象中包含了两块内存,分别存放值为2的 count 的实例变量和值为20 的 count 的实例变量 总结:不管变量的编译时类型和运行时类型相不相同...对象拥有3个count实例变量,也就是说,需要3块内存来存储它们 当Sub sub = new Sub();这句执行完后,该对象内存中的存储如下图所示: ?...程序允许通过方法return this;返回调用该方法的Java对象,但不允许直接return super或者直接将super当成一个引用变量来使用,接下来会深入的分析这些语法规则 Apple apple...> 当程序创建一个子类对象时,系统不仅会为该子类中定义的实例变量分配内存,也会为在父类中定义的实例变量分配内存,例如:父类A中定义了2个实例变量,子类B中定义了3个实例变量,那么new B()这个对象

    32710

    详解 Java 对象内存控制(上)

    = 3 内存分析: Person 类也是 Class 类的一个对象,所以初始化 Person 类后,会在堆中为其分配一块内存,而静态变量是类的变量,所以类初始化后会直接为静态变量分配内存空间,这个内存空间就在类的内存空间中...类变量的初始化优先级 类变量属于类本身,程序初始化类的时候会一并为该类的类变量分配内存空间并执行初始化,JVM 对一个类只初始化一次,因此 Java 程序每运行一次,系统只为类变量分配一次内存空间,执行一次初始化...创建 Java 对象的初始化过程 有如下继承结构: ?...,此时需要为这个 B 对象分配两块内存,分别存放父类 A 的 i 变量和 B 对象的 i 变量,关于 Java 对象怎样拥有多个同名的实例变量,在详解 Java 对象内存控制(下) 会有详细介绍 (2...当变量的编译时类型和运行时类型不同时,调用它的实例方法和实例变量存在这种差异的原因,会在详解 Java 对象内存控制(下) 继续讨论 8.

    46430

    Java虚拟机:Java内存区域及对象

    其次,堆内存和栈内存的这种划分方式比较粗糙,这种划分方式只能说明大多数程序员最关注的、与对象内存分配关系最密切的内存区域是这两块,Java内存区域的划分实际上远比这复杂。...2、线程间共享的内存区域 (1)HEAP,堆 大多数应用,堆都是Java虚拟机所管理的内存中最大的一块,它在虚拟机启动时创建,此内存唯一的目的就是存放对象实例。...对象创建 Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(克隆、反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此。...2、类加载检查通过后,虚拟机为新生对象分配内存对象所需内存大小在类加载完成后便可以完全确定,为对象分配空间无非就是从Java堆中划分出一块确定大小的内存而已。...3、内存分配结束,虚拟机将分配到的内存空间都初始化为零值(不包括对象头)。这一步保证了对象的实例字段在Java代码中可以不用赋初始值就可以直接使用,程序能访问到这些字段的数据类型所对应的零值。

    37620

    详解jvm内存结构,java内存模型,java对象布局,别再搞混啦!

    JVM内存结构 首先JVM内存结构和JAVA内存模型是两个概念. JVM内存结构: ?...Class文件通过类加载机制 加载到内存空间,JVM内存结构就是上图中内存空间,Java内存模型,则是另外的一个概念....根据《Java 虚拟机规范(Java SE 7 版)》规定,Java 虚拟机所管理的内存如下图所示。 ? 从上图可看出,运行时数据区分为五大区域。...结语 经过本篇学习,我们已经知道JVM对于内存的管理,以及它的结构, 千万不要搞混 JVM运行时数据区和JMM(Java memory modle)的关系 而JAVA对象布局在我的一篇文章中有讲过他们是不同的概念...JAVA对象布局 下一篇我们来研究JMM(java内存模型)和Java中的逃逸分析,以及多线程编程延伸.

    49020

    Java 虚拟机:Java对象内存布局

    今天我们就来看看对象内存布局。 压缩指针 在 Java 虚拟机中,每个 Java 对象都有一个对象头(object header),这个由标记字段和类型指针所构成。...在 64 位的 Java 虚拟机中,对象头的标记字段占 64 位,而类型指针又占了 64 位。也就是说,每一个 Java 对象内存中的额外开销就是 16 个字节。...当然,就算是关闭了压缩指针,Java 虚拟机还是会进行内存对齐。此外,内存对齐不仅存在于对象对象之间,也存在于对象中的字段之间。...下面我来介绍一下对象内存布局另一个有趣的特性:字段重排列。 字段重排列 字段重排列,顾名思义,就是 Java 虚拟机重新分配字段的先后顺序,以达到内存对齐的目的。...总结和实践 今天我介绍了 Java 虚拟机构造对象的方式,所构造对象的大小,以及对象内存布局。

    61960

    Java虚拟机:Java内存区域及对象

    其次,堆内存和栈内存的这种划分方式比较粗糙,这种划分方式只能说明大多数程序员最关注的、与对象内存分配关系最密切的内存区域是这两块,Java内存区域的划分实际上远比这复杂。...2、线程间共享的内存区域 (1)HEAP,堆 大多数应用,堆都是Java虚拟机所管理的内存中最大的一块,它在虚拟机启动时创建,此内存唯一的目的就是存放对象实例。...对象创建 Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(克隆、反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此。...2、类加载检查通过后,虚拟机为新生对象分配内存对象所需内存大小在类加载完成后便可以完全确定,为对象分配空间无非就是从Java堆中划分出一块确定大小的内存而已。...3、内存分配结束,虚拟机将分配到的内存空间都初始化为零值(不包括对象头)。这一步保证了对象的实例字段在Java代码中可以不用赋初始值就可以直接使用,程序能访问到这些字段的数据类型所对应的零值。

    33120

    jvm内存模型、jvm内存结构、Java内存结构、Java内存模型(JMM)、Java对象模型的区别(吐血研究整理)

    堆和栈的数据划分并不是绝对的,JIT会针对对象分配做一定的优化(可以去学习下 逃逸分析技术,栈上分配, 标量替换优化技术) Java内存模型(JMM): java内存模型又称为JMM。...Java对象模型: 概念理解:Java是一种面向对象的语言,而Java对象在JVM中的存储也是有一定的结构的。而这个关于Java对象自身的存储模型称之为Java对象模型。 Java对象保存在堆内存中。...在内存中,一个Java对象包含三部分:对象头、实例数据和对齐填充。...总结: jvm内存模型 == jvm内存结构 == Java内存结构,和Java虚拟机的运行时内存分区有关。 Java内存模型,和Java的并发编程有关。...Java对象模型,和Java对象在虚拟机中的表现形式有关。

    1.1K10

    Java对象的结构与对象内存中的结构

    对象的创建过程 当我们在Java中使用new这个指令创建一个对象的时候,对象的创建到底经过了什么样的一个过程呢?...7 astore_1:将变量a和新创建的对象建立关联(引用指向内存)。 这其中可以发现,当我们在堆内存中开辟内存时,还没有执行A的构造函数,也就是说此时内存中的相关对象并没有进行赋值操作。...这就叫做对象的半初始化,以前文的代码为例,当执行到创建对象,开辟内存空间的这一步操作时,a对象内存空间中虽然会出现一个m对象,但由于还没有执行类的构造函数,这个对象就不会被赋值,默认值为0。...对象在堆内存中的存储布局 这里的对象指的是普通对象,一个对象内存中的存储布局分为三个部分:对象头(Object Header)、实例数据(instance data)和对齐(padding)。...对象内存中的空间分配过程 对象从new出来开始,到被GC回收,其在内存中的空间分配过程主要如下: new一个新对象的时候,首先JVM判断该对象是否能进行栈上分配。

    1.7K11

    Java 虚拟机 2 : Java 内存区域及对象

    其次,堆内存和栈内存的这种划分方式比较粗糙,这种划分方式只能说明大多数程序员最关注的、与对象内存分配关系最密切的内存区域是这两块,Java内存区域的划分实际上远比这复杂。...2、线程间共享的内存区域 (1)HEAP,堆 大多数应用,堆都是Java虚拟机所管理的内存中最大的一块,它在虚拟机启动时创建,此内存唯一的目的就是存放对象实例。...对象创建 Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(克隆、反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此。...2、类加载检查通过后,虚拟机为新生对象分配内存对象所需内存大小在类加载完成后便可以完全确定,为对象分配空间无非就是从Java堆中划分出一块确定大小的内存而已。...3、内存分配结束,虚拟机将分配到的内存空间都初始化为零值(不包括对象头)。这一步保证了对象的实例字段在Java代码中可以不用赋初始值就可以直接使用,程序能访问到这些字段的数据类型所对应的零值。

    32920
    领券