java空对象占几个字节_从内存模型探究null引用与空对象实例的空间占用

发布时间 - 2026-01-29 00:00:00    点击率:
null引用不占堆内存,仅占栈中4或8字节;空Object实例在64位JVM默认下占16字节,含对象头与对齐填充;空数组如new Object[0]占24字节,含length字段。

在Java中,当声明一个对象引用但未初始化时,该引用指向null;而创建一个空对象实例(如new Object())则会在堆内存中分配实际空间。二者在内存模型中的表现存在本质差异。以下是关于null引用与空对象实例内存占用的详细分析:

一、null引用的内存占用

null是一个特殊的字面量,表示对象引用不指向任何堆内存地址。它本身不是对象,也不占用堆空间,仅作为引用类型的默认值存储在变量所在的位置(栈帧或对象字段中)。其大小取决于JVM对引用的实现方式。

1、在32位JVM上,普通对象引用通常为4字节,null即以全0比特模式填充该4字节空间。

2、在64位JVM上,若未启用压缩指针(-XX:-UseCompressedOops),对象引用为8字节,null对应8字节全0。

3、在64位JVM上,若启用压缩指针(默认开启),对象引用被压缩为4字节,null仍以4字节全0表示。

二、空对象实例的内存占用(以Object为例)

调用new Object()会触发JVM在堆中分配一个最简对象实例。该实例包含对象头(mark word + klass pointer)和可能的对齐填充,不含实例字段。其大小由JVM参数及平台决定。

1、在HotSpot JVM中,使用默认参数(-XX:+UseCompressedClassPointers -XX:+UseCompressedOops)的64位系统上,Object实例占用16字节:其中8字节mark word,4字节klass pointer,剩余4字节为对齐填充(保证16字节边界对齐)。

2、在禁用压缩指针的64位JVM中,Object实例占用24字节:8字节mark word,8字节klass pointer,8字节对齐填充。

3、在32位JVM中,Object实例占用8字节:4字节mark word,4字节klass pointer,无需额外填充(天然8字节对齐)。

三、数组类型空实例的内存占用

空数组(如new int[0]或new Object[0])是实际分配的对象,具备完整对象头与长度字段,因此比普通Object实例多出一个用于存储数组长度的4字节字段。

1、new Object[0]在默认64位JVM下占用24字节:16字节基础对象头结构 + 4字节length字段 + 4字节对齐填充。

2、new int[0]在相同环境下同样占用24字节:对象头16字节 + length字段4字节 + 对齐填充4字节;注意其elements区域长度为0,不额外分配元素空间。

3、在32位JVM中,new Object[0]占用12字节:8字节对象头 + 4字节length字段,无需填充。

四、验证内存占用的实验方法

可通过JOL(Java Object Layout)工具直接观测对象内存布局,该工具利用Unsafe获取底层内存信息,结果可靠且与JVM实际行为一致。

1、添加Maven依赖:引入org.openjdk.jol:jol-core:0.17及以上版本。

2、编写测试代码:调用Instrumentatio

n.getObjectSize()或直接使用new org.openjdk.jol.vm.VM().details()输出布局。

3、运行时需添加JVM参数:-XX:+UseCompressedOops -XX:+UseCompressedClassPointers(确保与生产环境一致)。

五、对象字段对齐与填充的影响

JVM要求对象起始地址按8字节对齐,且对象总大小必须是8字节的整数倍。当对象头与字段总和不足8字节倍数时,自动追加填充字节,导致看似“空”的对象实际占用更多空间。

1、定义class Empty {}与class OneByte { byte b; }在默认64位JVM下均占用16字节,因前者无字段仍需对齐,后者1字节+填充15字节。

2、class EightBytes { long l; }占用16字节:8字节对象头 + 8字节字段,恰好满足对齐,无需额外填充。

3、class NineBytes { long l; byte b; }占用24字节:8字节头 + 8字节long + 1字节byte + 7字节填充。


# word  # java  # 字节  # 工具  #   # ai  # 内存占用  # maven  # jvm  # Object  # NULL  # int  # 指针  #   # class  # 引用类型  # Length  # pointer  # 对象  # 是一个  # 也不  # 为例  # 不含  # 可通过  # 多出  # 则会  # 创建一个  # 即以  # 仍需 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  如何在阿里云完成域名注册与建站?  如何用y主机助手快速搭建网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  手机网站制作与建设方案,手机网站如何建设?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  西安专业网站制作公司有哪些,陕西省建行官方网站?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  Laravel如何处理和验证JSON类型的数据库字段  香港网站服务器数量如何影响SEO优化效果?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何在七牛云存储上搭建网站并设置自定义域名?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  JavaScript中的标签模板是什么_它如何扩展字符串功能  Linux系统运维自动化项目教程_Ansible批量管理实战  iOS UIView常见属性方法小结  Android自定义listview布局实现上拉加载下拉刷新功能  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  JS实现鼠标移上去显示图片或微信二维码  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  如何选择可靠的免备案建站服务器?  JavaScript如何实现路由_前端路由原理是什么  如何在IIS7上新建站点并设置安全权限?  JavaScript实现Fly Bird小游戏  HTML 中动态设置元素 name 属性的正确语法详解  如何在自有机房高效搭建专业网站?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  原生JS实现图片轮播切换效果  Laravel Session怎么存储_Laravel Session驱动配置详解  想要更高端的建设网站,这些原则一定要坚持!  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  如何快速完成中国万网建站详细流程?  java ZXing生成二维码及条码实例分享  Python进程池调度策略_任务分发说明【指导】  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  制作电商网页,电商供应链怎么做?  bing浏览器学术搜索入口_bing学术文献检索地址  Laravel如何实现API版本控制_Laravel版本化API设计方案  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何快速生成ASP一键建站模板并优化安全性?  js实现点击每个li节点,都弹出其文本值及修改  如何快速搭建安全的FTP站点?  如何用PHP快速搭建CMS系统?  Laravel如何创建自定义Artisan命令?(代码示例)