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

一、对象头部Header的布局

Mark Word

Class 指针

在32位系统下,上面两部分各占4B;

在64位系统中,Mark Work占4B,class指针在开启指针压缩的时候占4B;为开启指针压缩的时候占8B.

1、Mark Word 存储对象自身的运行时数据信息,例如哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID。

2、Class 指针,通过该指针确定该对象是哪个类的实例。

另外,如果该对象是一个数组,那么还将会有一个数据来记录数组的长度4B(32bit)/8B(64bit)。

二、数据部分

在该字段中,无论是从父类继承下来的还是该类自身的,都需要记录下来,而这部分的存储顺序受虚拟机的分配策略和定义的顺序的影响。

默认分配策略:long/double ->  int/float -> short/char -> byte/boolean -> Reference

如果设置了-XX:FieldsAllocationStyle=0(默认是1),那么引用就会放在最前面:

Reference -> long/double ->  int/float -> short/char -> byte/boolean

结论:分配策略总是按照宽度由大到小的顺序排列,相同宽度的放在一起。

在有继承关系的对象中,只有一个头部,父类的属性分配到该对象中,这样才能通过父类访问他的属性。如果开启CompactFields,那么,子类中较窄的变量就会插到父列的变量的空隙中。

[[注]] 静态属性所占的空间通常不计算到对象本身的空间中,以为他的引用是在方法区。

属性的对齐,例如byte占用一个字节的空间,那么就会填充3字节实现对齐。(32bit系统)

三、对齐填充

Java对象在内存中将以8字节对齐,也就是对象的总大小必须是8字节的整数倍。

java 对象内存布局_Java--对象内存布局相关推荐

  1. java对象的内存结构_Java对象在内存中的结构分析

    问题:在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍? HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头.实例数据和对齐填充,其中对象头又分为:Mark ...

  2. java对象内存模型_Java对象的内存模型

    众所周知,函数调用在内存中是通过压栈,退栈实现的,而Java的方法调用则是在JVM栈中通过栈帧实现的,且所有的Java对象都只在堆上分配内存.那么一个Java对象在堆内存里到底长啥样呢?实际上,当一个 ...

  3. java对象生命周期_Java对象生命周期和类生命周期

    原标题:Java对象生命周期和类生命周期 作者:彭空空 链接:https://www.jianshu.com/p/25ea857ba78b 导读 对象的生命周期 类的加载机制 类的生命周期 类加载器 ...

  4. java thread 内存泄露_Java ThreadLocal 内存泄露问题分析及解决方法。

    前言 在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露.强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这 ...

  5. java内存泄漏和内存溢出_Java和内存泄漏

    java内存泄漏和内存溢出 总览 术语"内存泄漏"在Java中的使用方式不同于在其他语言中使用的方式. 通用术语中的"内存泄漏"是什么意思,在Java中如何使用 ...

  6. java 对象池 实现_Java对象池技术的原理及其实现

    看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...

  7. java虚拟机内存监控_java虚拟机内存监控工具jps,jinfo,Jstack,jstat,jmap,jhat使用...

    将会打印出很多jvm运行时参数信息,由于比较长这里不再打印出来,可以自己试试,内容一目了然 Jstack(Stack Trace for Java):JVM堆栈跟踪工具 jstack用于打印出给定的j ...

  8. java中为什么还要防止内存泄露_JAVA防止内存的泄漏什么意思,内存还能泄露?...

    展开全部 尽管java虚拟机和62616964757a686964616fe59b9ee7ad9431333166353066垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄 ...

  9. java虚拟机内存告警_java虚拟机内存溢出各种场景总结

    java堆溢出 java堆用于存储对象实例,只要不断地创建对象,并且保证gc roots到对象之间有可达路径来避免垃圾回收机制来清楚这些对象,那么在 对象到达最大堆的容量限制后就会产生内存溢出溢出. ...

  10. java 内存 静态_java中内存分配以及static的用法(转)

    JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢 ...

最新文章

  1. linux命令(2)vmstat
  2. Bech32编码 (2)原理
  3. ios lua 增量更新,更新内部代码
  4. 文件压缩 Huffman编码 (java)
  5. 解决PL/SQL查询结果乱码的问题
  6. 20145324 《Java程序设计》第1周学习总结
  7. 用jsp编写一个猜26个小写英文字母的web小游戏
  8. 如何设计企业特色的数字化转型架构?
  9. android按钮延迟显示出来,android Toast显示延迟的优化方案
  10. 【matlab实现多种股票数据同列收盘价格分析走势图,以及涨跌幅变化曲线第二篇】
  11. 数据分析的终极目标-预测第1辑
  12. 2014婚纱照8大流行风格大揭密
  13. 什么是以太网,它在WiFi世界中的价值是什么?
  14. firewall 防火墙
  15. python对股票的基本面进行分析_python菜鸟学员如何获取沪深股票基本面数据
  16. CAD填充图案如何缩放
  17. tp5 批量更新多条记录_TP5数据库操作——更新
  18. 【KKT】∇f(x)+λ∇g(x)=0中λ的讨论
  19. Word中的空白页,怎么也删不掉?如何操作?
  20. python3半自动爬虫,获取风暴英雄官方壁纸

热门文章

  1. redis 双写一致性 看一篇成高手系列1
  2. 【C#】枚举_结构体_数组
  3. 机房收费系统【VB版】——上下机
  4. 输入输出导入导出问题
  5. line_profile逐行代码分析
  6. pytorch BiLSTM+CRF代码详解 重点
  7. LeetCode简单题之二进制表示中质数个计算置位
  8. CUDA 11功能展示
  9. 机器人导航两篇顶级会议论文解析
  10. Cocos事件监听(JS)