讲师中心 微信公众号
AI工具推荐 视频效率加速

什么是集合的内存占用分析_一个空的ArrayList占用多少字节

雨墨吖_2528

雨墨吖_2528

发布时间:2026-02-18 14:34:03

|

737人浏览过

|

来源于php中文网

原创

空的 ArrayList 占约 40 字节(64 位 JVM + 压缩指针),这是其浅层大小,不含内部 Object[10] 数组的 64 字节;实际内存压力需看 retained size,推荐用 JOL 或 heap dump 分析。

什么是集合的内存占用分析_一个空的arraylist占用多少字节

空的 ArrayList 占多少内存?直接说结论:约 40 字节(64 位 JVM + 压缩指针)

它不是“零开销”,也不是“随便用没关系”。一个刚 new ArrayList() 出来的实例,底层会分配一个长度为 10 的 Object[] 数组——哪怕一个元素都没加。

拆解来看:

  • ArrayList 对象头:12 字节(Mark Word 8 + Klass Pointer 4)
  • ArrayList 实例字段:3 个引用(elementData、size、modCount),其中 elementData 是 4 字节(压缩指针),size 和 modCount 各占 4 字节整型 → 共 12 字节
  • 内部数组 Object[10]:对象头 16 字节 + 10 × 4 字节引用 = 56 字节 → 对齐到 8 字节倍数 → 实际占 64 字节
  • 加总后对齐填充:12 + 12 + 64 = 88 → 向上对齐到 96 字节?不对。实际经 JOL(Java Object Layout)验证,在典型 OpenJDK 17+ 环境下,ArrayList 实例浅层大小为 40 字节,其内部 Object[10] 单独算为 64 字节,二者不合并计——因为 elementData 是引用,getObjectSize() 默认只算浅层,不算引用目标。

所以如果你用 Instrumentation.getObjectSize(new ArrayList()),结果通常是 40;而用 JOL 查看整个对象图,你会发现真正吃内存的是那个默默存在的 Object[10]。

为什么不能靠 getObjectSize() 准确评估集合真实内存压力

这个方法只返回“浅层大小”(Shallow Size),也就是对象自己占多少,不包括它引用的数组、节点、Entry 等。对集合来说,这几乎等于“只看了门牌号,没进屋看家具”。

常见误判场景:

  • 你看到 HashMap 浅层大小才 48 字节,以为很轻量 → 实际它默认初始化一个 Node[16] 数组(64 字节)+ 每个 Node 至少 32 字节(key/value/hash/next),插 1 万条就爆几百 MB
  • new ArrayList() 返回 40 字节,但你后续 add 600 万个 Long,每个 Long 对象实占 24 字节 → 光装箱对象就 137 MB,再加上数组引用 24 MB,总开销远超 160 MB
  • 用 ArrayList<arraylist>></arraylist> 嵌套三层?每层都带自己的数组和对象头,浅层大小完全失真

真正要摸清内存水位,得用 VisualVM 或 Eclipse MAT 抓 heap dump,看 “Retained Size” —— 它告诉你:删掉这个 ArrayList,JVM 能回收多少内存。

怎么避免空集合偷偷吃掉大量内存

空集合不是问题,但“批量创建却永不使用”的空集合是隐形负债。尤其在缓存、DTO、分页封装等场景中极易泛滥。

  • 别写 return new ArrayList(); 当默认值,改用 Collections.emptyList() —— 它返回的是共享的、不可变的单例,浅层大小 ≈ 16 字节(纯对象头)
  • 如果必须可变,且确定后续会 add 大量元素,直接指定初始容量:new ArrayList(expectedSize),避免扩容复制和冗余空间
  • Spring 中 Controller 返回 List,别让 MyBatis 或 JPA 自动 new 出一堆空 ArrayList;可在 mapper 层用 resultType="java.util.LinkedHashMap" 或流式处理规避
  • 注意 ORM 框架的懒加载代理集合(如 Hibernate 的 PersistentBag),它们即使为空,也可能持有一个未初始化但已预留结构的容器,内存行为更难预测

用 JOL 验证比凭经验靠谱得多

光背规则容易错,JVM 版本、是否开启压缩指针、甚至 GC 类型都会影响对象布局。唯一稳的方法是实测。

  • 加依赖:org.openjdk.jol:jol-core
  • 写一行代码:
    System.out.println(VM.current().details());<br>System.out.println(ClassLayout.parseClass(ArrayList.class).toPrintable());<br>System.out.println(ClassLayout.parseInstance(new ArrayList<>()).toPrintable());
  • 重点关注输出里的 OFFSET、SIZE 和最后的 Instance size,它才是真实占用字节数
  • 对比 new ArrayList() 和 new ArrayList(1000),你会直观看到数组字段偏移和大小变化

对象内存从来不是“写了 new 就完事”,而是每次分配都在跟 JVM 的对齐策略、GC 压力、CPU 缓存行博弈。空集合看着小,堆里攒几百个,就能让 GC 多跑一轮 —— 这种细节,不测,真不知道。

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2871

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

517

2026.01.26

eclipse教程
eclipse教程

php中文网为大家带来eclipse教程合集,eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。php中文网还为大家带来eclipse的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

710

2023.06.14

eclipse怎么设置中文
eclipse怎么设置中文

eclipse设置中文的方法:除了设置界面为中文外,你还可以为Eclipse添加中文插件,以便更好地支持中文编程。例如,你可以安装EBNF插件来支持中文变量名,或安装Chinese Helper来提供中文帮助文档。本专题为大家提供eclipse设置中文相关的各种文章、以及下载和课程。

6106

2023.07.24

c语言编程软件有哪些
c语言编程软件有哪些

c语言编程软件有GCC、Clang、Microsoft Visual Studio、Eclipse、NetBeans、Dev-C++、Code::Blocks、KDevelop、Sublime Text和Atom。更多关于c语言编程软件的问题详情请看本专题的文章。php中文网欢迎大家前来学习。

9519

2023.11.02

Eclipse版本号有哪些区别
Eclipse版本号有哪些区别

区别:1、Eclipse 3.x系列:Eclipse的早期版本,包括3.0、3.1、3.2等;2、Eclipse 4.x系列:Eclipse的最新版本,包括4.0、4.1、4.2等;3、Eclipse IDE for Java Developers等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2804

2024.02.23

eclipse和idea有什么区别
eclipse和idea有什么区别

eclipse和idea的区别:1、平台支持;2、内存占用;3、插件系统;4、智能代码提示;5、界面设计;6、调试功能;7、学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

662

2024.02.23

eclipse设置中文全教程
eclipse设置中文全教程

本专题整合了eclipse设置中文相关教程,阅读专题下面的文章了解更多详细操作。

3946

2025.10.10

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn