Object[] objects = new Object[10000000];
在JVM中分配数组会导致大量内存(约40M)的使用?是否有任何方法可以了解VM的内部工作方式来分配数组?
Object[] objects = new Object[10000000];
在JVM中分配数组会导致大量内存(约40M)的使用?是否有任何方法可以了解VM的内部工作方式来分配数组?
这将为10000000个引用分配足够的空间,同时还为数组对象本身分配了一小部分开销。
实际大小取决于虚拟机 - 但它占用相当多的内存并不令人惊讶...我期望至少需要40MB,在64位虚拟机上可能需要80MB,除非它对数组使用压缩指针。
当然,如果您用这么多不同的对象填充数组,那将需要更多的内存...但数组本身还需要空间来存放引用。
“a lot of memory”是什么意思?你分配了10000000个指针,每个指针占用4字节(在32位机器上)-这大约需要40MB的内存。
由于需要为1000万个对象及其相关开销分配堆空间,这导致了大量内存的使用。
如果要了解JVM的内部工作原理,可以查看它的源代码,因为它是开源的。 点击此处。
new
,然后它就会放在堆上。但更具体地说:堆包含对象及其实例变量(包括不是用 new
创建的基本类型)。数组值也放在堆上。 - Jeff您的数组必须保存1000万个对象引用,而现代平台上的引用大小为64位(8字节)。由于它是作为一块连续的存储空间分配的,因此应该需要8000万字节。从某种意义上来说,这很大,但与您可能拥有的内存量相比,它很小。为什么它困扰着您呢?
数组被广泛使用的主要原因之一是它们的元素可以在常数时间内访问。这意味着访问a[i]所需的时间对于每个索引i都是相同的。这是因为可以通过将适当的偏移量添加到数组头的地址来算术确定a[i]的地址。原因是分配数组内容的空间作为连续的内存块。
Object
数组,其中包含10M个元素,则从一开始就已经使用了约40MB的内存。如果你开始填充该数组,实际上有10M个对象,则大小会迅速增加。
根据这个网站上的内容,在我的64位机器上进行了测试,一个普通Object
的大小约为31字节,因此10M个Object
数组的大小只是大约12字节+(4 + 31字节)* 10M = 350,000,012字节(或345.78 MB)。
如果你的数组中包含其他类型的对象,则大小将更大。
如果你必须在程序中保留如此多的数据,我建议你使用某种随机访问文件来保存数据。甚至可以使用数据库,例如Apache Derby,这还能使你对数据进行排序和过滤等操作。
我可能有点落后,但是我从《实用Java》这本书中了解到,向量比数组更高效、更快。那么,是否可以使用向量代替数组呢?