温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Hashtable的内存占用如何

发布时间:2025-11-19 11:04:53 来源:亿速云 阅读:120 作者:小樊 栏目:编程语言

Java Hashtable 内存占用概览

核心结论

  • 在常见的 32 位 HotSpot JVM 上,空实例约占 104 字节:其中 Hashtable 对象 40 字节,默认容量为 11 的 Entry 数组 64 字节(11×约 5.8 字节/引用,考虑对象头与对齐)。每个条目由 Hashtable$Entry 表示,包含 int keyHash、Object next、Object key、Object value,单条目的“额外开销”约为 32 字节(不含 key/value 本身)。在接近默认负载因子 0.75 时,空表会预留约 8 个槽位,因此可近似理解为“对象开销 56 字节 + 每条目 36 字节”。当元素达到 10,000 条时,整体占用约 360 KB(与 HashMap 的量级接近)。

结构与默认参数

  • 默认构造会立即创建长度为 11 的 Entry 数组,负载因子 0.75,扩容阈值为 11×0.75=8(超过即扩容)。扩容策略为“原容量×2+1”,例如从 11 扩容到 23。此外,Hashtable 默认是同步的(方法级 synchronized),会带来一定的并发控制开销(对象头中的 monitor 等),但对“浅内存占用”影响较小。

估算方法与示例

  • 估算公式(32 位、HotSpot,忽略对齐填充的微小差异):
    • 空表占用 ≈ 56 字节 + 11×引用大小(≈104 字节)
    • 近似每新增 1 条占用 ≈ 36 字节(Entry 对象开销 32 字节 + 引用开销 4 字节)
    • 粗略总量 ≈ 56 + 36×N + 键/值自身占用(N 为元素个数)
  • 示例(32 位估算,单位:字节):
    • N=0:约 104
    • N=8(阈值):约 344(=56 + 36×8 + 0)
    • N=10,000:约 360,056(≈360 KB,外加键/值对象本身)
  • 说明:64 位 JVM 的引用与对象头更大,实际占用会高于 32 位;此外,键/值对象本身的引用与对象头也需计入总占用。

降低内存占用的实践

  • 避免创建“空表”:若集合经常为空,延迟初始化或直接不创建可节省约 104 字节/实例;实际项目中曾统计到集合对象有较高比例为空,优化收益明显。
  • 设置合理的初始容量:尽量让初始容量接近预期元素数,减少扩容与稀疏数组带来的浪费(例如预期 1,000 条,初始容量设为 1,333 可覆盖 0.75 阈值)。
  • 若不需要同步,优先选择 HashMap(非同步、默认容量 16、扩容 ×2),在多数场景下更省内存且性能更好;仅在需要线程安全且无法接受外部同步时才使用 Hashtable。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手