关于字节对齐以及内存占用

参考博文: http://www.javamex.com/tutorials/memory/object_memory_usage.shtml

本文主要考虑正常情况下一个对象在堆上的内存占用情况:对于下面的特殊情况不作讨论

1、某些情况下,JVM可能不会把对象存储在堆上:比如小的线程私有对象原则上会全部存储在栈或寄存器上,严格意义上说并不存在于java堆上

2、对象的内存占用可能依赖于它当前的状态,比如说它的同步锁是否处于竞争状态、是否正处于垃圾回收阶段(这些额外的“系统”数据不一定存储在java堆上)

在HotSpot虚拟机上,一个java对象的内存占用一般包括如下几部分:

1、一个对象头部信息(包括几字节的基本元信息)

2、原始类型字段的内存占用

3、引用字段的内存占用

4、对齐字节(padding):为了让每个对象的开始地址是字节的整数倍,减少对象指针占用的比特数,对象数据后面会添加一些“无用”的数据(字节),以实现对齐,即保证最终的字节大小是8的倍数

HotSpot虚拟机的对象头包含两部分信息:1、用于存储对象自身的运行时数据,这部分数据在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit。

2、类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。注:如果java对象是一个数组,还必须包含用于记录数组长度的数据,因为java虚拟机可以从普通java对象的元数据信息确定对象的大小,但是从数组的元数据中却无法确定数组的大小。

下图描述了32bit下对象头的存储状态:

实例数据部分是对象真正存储的有效信息:也即程序代码定义的各种类型的字段内容。

这部分的存储顺序会受到虚拟机的的分配策略参数和字段在java源码中定义的顺序的影响。

java元数据类型占用字节列表:

可能会认为boolean会占用一比特或者占用一个字节的第八位,但是HotSpot虚拟机会为每个Boolean字段分配一个字节的空间。

在HotSpot中,每个对象占用的内存大小是 8 字节的倍数。如果对象所需的内存大小(包括头信息和字段)不是 8 的倍数,则会向上取整到 8 的倍数。

也就是说:

1、一个空对象占用8字节

2、只有一个 boolean 字段的类实例占 16 字节:头信息占 8 字节,boolean 占 1 字节,为了对齐达到 8 的倍数会额外占用 7 个字节

3、包含 8 个 boolean 字段的实例也会占用 16 字节:头信息占用 8 字节,boolean 占用 8 字节;因为已经是 8 的倍数,不需要补充额外的数据来对齐

4、一个包含 2 个 long 字段、3 个 int 字段、1 个 boolean 字段的对象将占用:

  • 头信息占 8 字节;
  • 2 个 long 字段占 16 字节(每个 long 字段占用 8 字节);
  • 3 个 int 字段占 12 字节(每个 int 字段占用 4 字节);
  • 1 个 boolean 字段占 1 个字节;
  • 为了对齐额外多 3 个字节(上面加起来是 37 字节,为满足对齐 8 的倍数 40)

 关于二维数组占用字节数计算:注意数组有一个不同的地方在于,它本身会有一个记录数组长度的int类型,占用4字节,本身又是一个对象,会占用8字节

For example, let's consider a 10x10 int array. Firstly, the "outer" array has its 12-byte object header followed by space for the 10 elements. Those elements are object references to the 10 arrays making up the rows. That comes to 12+4*10=52 bytes, which must then be rounded up to the next multiple of 8, giving 56. Then, each of the 10 rows has its own 12-byte object header, 4*10=40 bytes for the actual row of ints, and again, 4 bytes of padding to bring the total for that row to a multiple of 8. So in total, that gives 11*56=616 bytes. That's a bit bigger than if you'd just counted on 10*10*4=400 bytes for the hundred "raw" ints themselves.

关于java内存占用更为详细的描述可以参考廖祜秋大神的博客:http://www.liaohuqiu.net/cn/posts/caculate-object-size-in-java/

廖神的博文中已经指出对于HotSpot,在32位的JVM中,一个对象引用占用4字节,而在64位的JVM中,一个对象引用占用8字节(在开启指针压缩的话占用4字节),而在Dalvik中则是始终占用4字节。

针对Dalvik,元数据类型的大小分别在作为对象域或变量,以及数组的一个元素时是不同的

在Dalvik中对象对齐边界也是8字节,但是一个对象的内存占用和HotSpot是不同的:

会有一个额外的dlmalloc空间占用,4或8字节

所以一个空对象会占用16字节(12字节的内存占用以及4字节的对齐)

示例演示:

class EmptyClass {
}

Total size: 8 (Object overhead) + 4 (dlmalloc) = 12 bytes. For 8 bytes alignment, the final total size is 16 bytes.

class Integer {int value; // 4 bytes } 

The total size is: 8 + 4 + 4 (int) = 16 bytes.

static class HashMapEntry<K, V> { final K key; // 4 bytes final int hash; // 4 bytes V value; // 4 bytes HashMapEntry<K, V> next; // 4 bytes } 

The total size: 8 + 4 + 4 * 4 = 28 bytes. Total aligned is 32 bytes.

 详细描述参考廖神博文:http://www.liaohuqiu.net/posts/android-object-size-dalvik/

 

转载于:https://www.cnblogs.com/CoolRandy/p/5756528.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能应用实践与趋势

来源&#xff1a;阿里云研究中心《崛起的超级智能》一书主要阐述当今天人类为人工智能的春天到来而兴奋&#xff0c;为人工智能是否超越人类而恐慌的时候&#xff0c;一个更为庞大、远超人类预期的智能形态正在崛起&#xff0c;种种迹象表明50年来&#xff0c;互联网正在从网状…

excel表格打印每页都有表头_这么漂亮的Excel表格,用黑白打印机打印真是可惜了...

我们在日常工作中&#xff0c;利用Excel制作的表格通过会填充颜色&#xff0c;设置字体和边框格式、颜色&#xff0c;把表格弄的漂漂亮亮的&#xff0c;一个是为了缓解视觉疲劳&#xff0c;另一个是为了老板看到漂亮的表格一不小心加工资呢&#xff0c;但是一个问题出来了&…

常用的分隔符有哪三种_加固博士:常用防水材料大比拼,究竟花落谁家?

建筑物漏水问题&#xff0c;是日常生活中非常常见的问题&#xff0c;房屋漏水怎么办才好呢&#xff1f;这个问题困扰了很多人&#xff0c;有些户主会图个省事&#xff0c;将漏水问题直接交给装修公司&#xff0c;只要愿意支付防水施工费用&#xff0c;装修公司就会安排资深的师…

互联网大脑,城市大脑的“大脑”究竟什么含义?

来源&#xff1a;刘锋的未来课堂21世纪以来&#xff0c;科技领域与一个神经学领域的概念 “大脑”出现了意外的结合&#xff0c;涌现出诸多前沿科技的大脑概念。从互联网大脑&#xff0c;城市大脑&#xff0c;到谷歌大脑&#xff0c;百度大脑&#xff0c;讯飞超脑、360安全大脑…

电脑fps低怎么办_电脑想要英雄联盟玩的流畅,主要看哪几个方面?

刚刚在找素材的时候&#xff0c;看到有个兄弟在某乎上说打英雄联盟有点卡&#xff0c;换个固态硬盘能不能提升游戏体验。在看到这个问题之后&#xff0c;小编发现原来还有很多电脑小白不知道什么东西会影响游戏体验。所以今天我就大概说一下玩英雄联盟这款游戏看重的地方吧。小…

使用代理下载Unity AssetStore上资源的方法

Unity的AssetStore下载package的时候经常抽风&#xff0c;而且开了代理工具的全局代理依然无效。 检索网络后得知&#xff0c;这是因为它下载的时候不检测IE代理设置&#xff0c;而是取环境变量中HTTPS_proxy和HTTP_proxy的值&#xff0c;所以添加这两个变量并指定其为你的代理…

2019华为全联接大会(汇总)

来源&#xff1a;龙为科技2019年9月18-20日&#xff0c;华为公司在上海举办第四届华为全联接大会&#xff08;HUAWEI CONNECT&#xff09;&#xff0c;发布云和AI的最新产品与解决方案&#xff0c;分享如何应用云和AI的技术,推进数字化转型的最新实践。华为首次发布整体计算战略…

xlwings 合并单元格 读取_xlwings,让excel飞起来

excel已经成为必不可少的数据处理软件&#xff0c;几乎天天在用。python有很多支持操作excel的第三方库&#xff0c;xlwings是其中一个。关于xlwingsxlwings开源免费&#xff0c;能够非常方便的读写Excel文件中的数据&#xff0c;并且能够进行单元格格式的修改。xlwings还可以和…

一棵树的生物量怎么算_宾利的眼镜盒价值2万,算坑人吗?网友:良心产品,不坑穷人...

阅读本文前&#xff0c;请您先点击上面的蓝色字体“总李谈车”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。原创持续更新“第1991天”宾利&#xff0c;全球顶级豪车之一&#xff0…

Gartner 2019年人工智能成熟度曲线的超前趋势

来源&#xff1a;FreeBuf.COMGartner的这种成熟度周期凸显出人工智能正以多种不同的方式影响企业根据Gartner对2019年的CIO议程调查&#xff0c;2018年至2019年间&#xff0c;部署人工智能(AI)的组织从4%增长到了14%。与几年前相比&#xff0c;人工智能正在以多种不同的方式影响…

生产环境可以用吗_柑橘可以生产果醋吗?柑橘果醋的生产工艺是什么?

柑橘可以生产果醋吗&#xff1f;柑橘果醋的生产工艺是什么&#xff1f;柑橘果醋的生产工艺&#xff0c;其特征在于它是以新鲜、成熟的柑橘类水果&#xff0c;特别是宽皮桔类、柑类、橙类等柑橘为原料&#xff0c;通过去皮、榨汁、离心分离、脱苦、低温酒精发酵、醋酸发酵、陈酿…

a4b5笔记本大小对比_天津订做笔记本*价格多少【广通印务】

天津订做笔记本*价格多少【广通印务】很多礼品盒包装设计师选择将绿色和环保理念融入到礼品盒包装设计中&#xff0c;让整个礼品盒包装充满自然之气&#xff0c;不但愉悦了客户的心情。 廊坊市广通印务有限公司是廊坊印刷行业的专家&#xff0c;——执着追求精彩印刷品&#xf…

我国北斗卫星导航系统在轨卫星已达39颗

资料图&#xff1a;北斗导航卫星发射。 图 郭文彬来源&#xff1a;新华网我国在轨卫星达39颗卫星导航应用的蓬勃发展&#xff0c;始终伴随航天技术的创新与突破。北斗卫星导航系统是全球四大卫星导航核心供应商之一&#xff0c;目前在轨卫星已达39颗。北斗系统据中国卫星导航系…

linux c语 curl代码_偷懒必备工具——一键生成爬虫代码

我们在构建网络请求的时候&#xff0c;不可避免地要添加请求头&#xff08;headers&#xff09;&#xff0c;以mdn学习区为例&#xff08;https://developer.mozilla.org/zh-CN/docs/learn&#xff09;&#xff0c;我们的请求头是这样的&#xff1a;一般来说&#xff0c;我们只…

xml转svg_C# Excel 转PDF/图片/HTML/TXT/XML/XPS/CSV/ODS/SVG/EMF

在日常工作中可能会遇到将某文件转换为其他格式的文件的情况&#xff0c;在本篇文章中将介绍如何在C#程序中将Excel文档转为PDF、IMAGE、HTML、TXT、XML、XPS、CSV、ODS、SVG、EMF、XLSM等格式的文件。工具使用&#xff1a;Free Spire.XLS http://for.NET&#xff08;免费版&am…

全球大数据发展分析报告

来源&#xff1a;人工智能产业链联盟 国智清创雄安机器人研究院《2018全球大数据发展分析报告》由天府大数据国际战略与技术研究院联合中国科学院虚拟经济与数据科学研究中心、中国科学院大数据挖掘与知识管理重点实验室、成都市大数据协会共同发布。报告对大数据发展历程&am…

三维叉乘怎么算_3分钟做完这些题,你的CAD才算熟练

3分钟做完这些题&#xff0c;你的CAD才算熟练“有没有CAD教程”&#xff0c;“如何学习CAD&#xff1f;”......这样的留言每隔一段时间都能看到。CAD说简单其实也挺简单的&#xff0c;但是深入应用起来确实很难。而因为当中涉及繁杂的功能命令&#xff0c;自然也就成为出教程的…

C和指针 第四章 习题

4.1正数的n的平方根可以通过&#xff1a; ai1 (ai n / ai ) / 2 得到&#xff0c;第一个a1是1,结果会越来越精确。 #include <stdio.h>int main() {double input;double exp;scanf_s("%lf", &input);double aBefore 1;double aNow (aBefore input / a…

技术界与翻译界的交锋:机器翻译离我们还有多远? | 清华AI Time

来源&#xff1a;大数据文摘作为自然语言处理中一项非常重要的应用&#xff0c;现代意义上的机器翻译概念从上世纪40年代提出至今&#xff0c;经过了几代革新&#xff0c;现已初步实现了多场景的落地和应用。近几年随着机器翻译质量的提高&#xff0c;机器翻译代替人工翻译的声…

obs噪音抑制调多少合适_TVS瞬态抑制二极管的特性及应用

TVS瞬态抑制二极管的特性及应用瞬态电压抑制器&#xff08;Transient Voltage Suppressor&#xff09;简称TVS&#xff0c;是一种二极管形式的高效能保护器件。当TVS二极管的两极受到反向瞬态高能量冲击时&#xff0c;它能以10-12秒量级的速度&#xff0c;将其两极间的高阻抗变…