我想问一下 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 分析器给我错误,稍后再试。