java编程中处处离不开对象,是否了解对象在内存中结构?是否知道如何计算对象在内存中具体大小呢?本篇文章将想你介绍对象在内存中布局以及如何计算对象大小。

内存结构

在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。如下图所示:

(1)普通对象内存结构

(2)java数组对象内存结构

对象头(Header)

makrword: 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为4个字节和8个字节,官方称它为“MarkWord”,该部分将在下一节关于锁在对象中展现会详细介绍。

klass指针:对象头的另外一部分是klass,类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例.

length : 如果对象是java数组,那在对象头中还必须有一块用于记录数组长度的数据。所以会用4个字节的int来记录数组的长度。

实例数据区

实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义的,都需要记录起来。

对齐填充

由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,这就要求当不为8字节整数倍时,就需要填充数据对齐填充。如此规定的原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问,详细原因介绍可以去查找相关资料。

基本数据类型的大小如下:

对于引用的大小如上对对象头中指针一样,不同位数JVM会有区别。在 32 位的 JVM 上,一个对象引用占用 4 个字节;在 64 位上,占用 8 个字节,开启指针压缩情况下占用4个字节。

实际工作中真正需要手动计算对象大小的场景应该很少,但是个人觉得做为基础知识每个Java开发人员都应该了解,另外:对自己写的代码大概占用多少内存,内存中是怎么布局的应该有一个直觉性的认识。

怎么计算java对象的大小?相关推荐

  1. 使用JOL工具计算Java对象的大小

    注意:本文默认环境为 64 位操作系统,JDK 为 1.8,JVM 为 HotSpot. 工具 JOL全称为Java Object Layout,是用来分析JVM中对象布局的工具,可以在运行时计算某个 ...

  2. java统计空间占用_JVM —— Java 对象占用空间大小计算

    引用类型(reference type: Integer)在 32 位系统上每一个占用 4bytes(即32bit, 才干管理 2^32=4G 的内存), 在 64 位系统上每一个占用 8bytes( ...

  3. JVM —— Java 对象占用空间大小计算

    零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 需要知道缓存的对象是否会超过 JVM 最大堆限制, 如果会超 ...

  4. 计算 java_两种计算Java对象大小的方法(转)

    原文:http://blog.csdn.net/iter_zc/article/details/41822719 另一篇类似文章:http://www.cnblogs.com/magialmoon/p ...

  5. 聊聊JVM(三)两种计算Java对象大小的方法

    普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐 ...

  6. instrumentation java_使用Instrumentation计算java对象大小

    对象大小的计算 正如笔者看的这篇文章所描述的一样,当我们试图获取一个JVM中的对象实际占用的空间大小时.通常使用的方法是徒手计算,或者通过gc计算前后内存差来估计对象大小.而今天要介绍的方法--利用I ...

  7. 两种计算Java对象大小的方法

    之前想研究一下unsafe类,碰巧在网上看到了这篇文章,觉得写得很好,就转载过来.原文出处是: http://blog.csdn.net/iter_zc/article/details/4182271 ...

  8. JVM概念之Java对象的大小与引用类型

    2019独角兽企业重金招聘Python工程师标准>>> 本文来自和你在一起的博客,原文标题:<JVM调优总结(二)-一些概念>.本文总结了JVM概念中的Java对象的大小 ...

  9. 如何计算Java对象的大小

    一个对象通常由头和内容组成.想要计算一个对象的大小,我们就需要分别计算头部的大小和内容的大小. 查看一个对象的大小 首先在pom文件中引入apache下面的lucene-core依赖,然后调用对应的s ...

最新文章

  1. XXL-REGISTRY v1.0.2 发布,分布式服务注册中心
  2. 使用pytorch搭建 RNN线性神经网络
  3. jQuery控制tab标签页
  4. 浅谈js本地图片预览
  5. [前台]---js重复上传一张图片两次,第二次失败的解决办法和思路
  6. css样式表中的样式覆盖顺序(转)
  7. Python基础-3内建函数 type() cmp()
  8. linux发送日志命令,linux:记录不同用户使用的命令发送到指定的目录中(可发送到日志服务器中)...
  9. arm hisiv100 linux,hisiv100交叉编译工具链安装
  10. tensorrt报错 [F] [TRT] Assertion failed: Unsupported SM.
  11. SQL Server对Xml字段的操作
  12. 利用jspx解决jsp后缀被限制拿shell
  13. python输入城市找省份_利用字典模拟省市区(县)的查询
  14. linux ps 主进程,Linux ps 查看进程
  15. 中创向心力:如何打造打造职业教育技术技能创新服务平台!
  16. 《算法图解》学习笔记(九):动态规划(附代码)
  17. 开源OceanBase如何与Prometheus与Grafana监控结合
  18. 半圆形进度条(html)
  19. 微信读书项目记录(1)
  20. 斯坦福博士退学,在 3 个领域改变世界,科技狂人马斯克的巅峰之路

热门文章

  1. 电脑无法输出4K信号怎么办
  2. 均值、方差和标准差计算的python代码
  3. Xmind基础教程-保存到印象笔记
  4. 截至20161210香港创业板股票代码和名称
  5. Excel实现自动显示日期且不自动改变
  6. 怎么做网站教程html文本文档,HTML新手教程
  7. 学习笔记二:IBIS模型编辑报错纠正
  8. table行的折叠和展开
  9. c语言双序列全局比对,基于动态规划进行双序列全局比对
  10. 凝思磐石linux系统怎么切双屏_linux (ubuntu) 下双屏显示解决?