【发布时间】:2011-02-12 20:33:44
【问题描述】:
我想问一下java中的内存开销, 我有一个大的 ArrayList(61,770 个项目),并试图计算每个项目占用的内存量(计算对象及其 ArrayList 条目), 通过分析应用程序,我了解到在加载所有数据后,堆占用约 25Mb。 当 ArrayList 只有 2 个项目时,堆占用 ~1Mb ,大致如下:
(24*1024*1024)/61,768 = 407 字节。
然而,当我计算每个对象的字段时,我得到 148 个字节(不包括 ArrayList,假设 int=4,float=4,reference=4),我很好奇要知道所有这些额外的字节是从哪里来的......
我可以猜测,由于我存储在 ArrayList 中的对象正在实现一个接口,它们存储了额外的值,也许 VM 为每个实现的方法存储了一个 4 字节的函数指针? 他们实现的接口有 20 个函数,因此增加了 80 个字节,总共 228 个字节,仍然没有接近测量的 400 个字节。
任何帮助将不胜感激。
哇,感谢所有精彩的答案。
@Bolo:感谢您的链接,对于这个类,我测量每个对象约 350 个字节,所以我至少可以确认大量内存使用的来源。
@Yuval A:感谢您的介绍,这是一个宝贵的信息来源。
@Ukko:注意点。
@Jayan:现在 NetBeans 分析器在我尝试转储堆时给我错误,稍后再试。
【问题讨论】:
-
如果你从 new ArrayList(61770) 开始而不是 new ArrayList() 然后让它自动调整大小,你也会得到不同的开销。在检查内存使用之前,您是否设置了正确的大小?
-
@flamealpha: 61 770 并不大 :) 我的 HashMap
太大了,以至于大多数系统都崩溃了……这就是为什么我用 Trove 的 TIntIntHashMap 这只是 所以 更多的内存/速度效率 :) 唉,它只适用于原语 :-/
标签: java memory interface arraylist overhead