0

0

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

月夜之吻

月夜之吻

发布时间:2026-01-29 18:29:58

|

953人浏览过

|

来源于php中文网

原创

null引用不占堆内存,仅占栈中4或8字节;空Object实例在64位JVM默认下占16字节,含对象头与对齐填充;空数组如new Object[0]占24字节,含length字段。

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

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

一、null引用的内存占用

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

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

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

立即学习Java免费学习笔记(深入)”;

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字节对齐填充。

Magician
Magician

Figma插件,AI生成图标、图片和UX文案

下载

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、编写测试代码:调用Instrumentation.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字节填充。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

236

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

458

2024.03.01

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

544

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

93

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

200

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

397

2023.07.18

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 52.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号