Java内存开销

use*_*841 4 java memory interface arraylist overhead

我想问一下关于Java内存开销,我有一个大的ArrayList(61770项),并试图计算出每个项目(统计对象及其ArrayList的条目)所采取的内存量,通过剖析应用程序我得到加载完所有数据后,堆需要大约25Mb.当ArrayList只有2个项时,堆需要〜1Mb,所以大致:

(24*1024*1024)/ 61,768 = 407字节.

但是,当我计算每个对象的字段时,我得到148个字节(不包括ArrayList,并假设int = 4,float = 4,reference = 4),我很想知道所有这些额外字节在哪里来了从...

我可以猜测,因为我存储在ArrayList中的对象正在实现一个接口,它们存储了额外的值,也许VM为每个实现的方法存储一个4byte的函数指针?它们实现的接口有20个函数,因此80个字节,总共228个字节,仍然不接近测量的400个字节.

任何帮助,将不胜感激.


哇,谢谢你所有的好答案.

@Bolo:感谢链接,这个类我测量每个对象大约350个字节,所以我至少可以确认大内存使用的来源.

@Yuval答:感谢您的介绍,这是一个宝贵的信息来源.

@Ukko:点注意到.

@Jayan:现在NetBeans Profiler在我尝试转储堆时给我错误,稍后再试.

Yuv*_*dam 6

这些结果并不令人惊讶.JVM为每个对象增加了大量开销.

由于JVM内存开销,单个对象的预期大小增加一倍并不罕见.

本演示文稿对Java中各种数据结构内存使用情况进行了精彩,深入的解释和概述.