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

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命令?(代码示例)

