我想询问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分析器在尝试转储堆时出现错误,稍后再试。
(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分析器在尝试转储堆时出现错误,稍后再试。