- java/
- 在Java中分配数组与分配链表时使用了多少内存?
在Java中分配数组与分配链表时使用了多少内存?
在Java中分配数组与分配链表时使用了多少内存?,java,arrays,memory,linked-list,Java,Arrays,Memory,Linked List,我猜它是数组中存储的每个值的32位/64位字(取决于CPU)。
因此,它将是数组大小X 32位/64位
在链表的情况下,存储指向下一个元素的引用需要两倍的时间。
因此它将是2*数组大小X 32位/64位
这对吗,我遗漏了什么吗?更多。链表中的每个元素都有:
指向下一个元素的指针、指向上一个元素的指针、指向项值的指针(12字节)+对象开销(大约另12字节)。比如说24字节
每个元素不是基本元素,而是一个包装器。如果每个元素都不同,它将占用空间。对于整数,再说16个字节
总计:每个元素40字节
我猜它是数组中存储的每个值的32位/64位字(取决于CPU)。
因此,它将是数组大小X 32位/64位
在链表的情况下,存储指向下一个元素的引用需要两倍的时间。
因此它将是2*数组大小X 32位/64位
这对吗,我遗漏了什么吗?更多。链表中的每个元素都有:
- 指向下一个元素的指针、指向上一个元素的指针、指向项值的指针(12字节)+对象开销(大约另12字节)。比如说24字节
- 每个元素不是基本元素,而是一个包装器。如果每个元素都不同,它将占用空间。对于整数,再说16个字节
总计:每个元素40字节
不要把它当回事,它只是给你一个想法。如果您想要精确的数字,请启动内存分析工具(例如Eclipse MAT)。我对数组的内存消耗进行了分析。以下是20000 ints阵列的结果:
OS: Windows 8 6.2, amd64
JVM: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 24.0-b56
x | min | avg | max | stddev
total cpu, ms | 7.000000 | 8.250000 | 10.000000 | 0.829156
bytes per LinkedList | 830.48 KB | 830.48 KB | 830.48 KB | 0.50 B
bytes per item | 42.00 B | 42.00 B | 42.00 B | 0.00 B
total cpu, ms | 4.000000 | 6.000000 | 7.000000 | 0.547723
bytes per ArrayList | 416.00 KB | 416.00 KB | 416.00 KB | 0.00 B
bytes per item | 21.00 B | 21.00 B | 21.00 B | 0.00 B
total cpu, ms | 0.000000 | 0.950000 | 1.000000 | 0.217945
byt per TIntArrayList| 105.56 KB | 105.56 KB | 105.56 KB | 0.00 B
bytes per item | 5.00 B | 5.00 B | 5.00 B | 0.00 B
操作系统:Windows 8 6.2,amd64
JVM:Oracle Corporation Java HotSpot(TM)64位服务器VM 24.0-b56
x |最小值|平均值|最大值|标准差
总cpu,毫秒7.000000,毫秒8.250000,毫秒10.000000,毫秒0.829156
每个链接列表的字节数| 830.48 KB | 830.48 KB | 830.48 KB | 0.50 B
每项字节数| 42.00b | 42.00b | 42.00b | 0.00b
总cpu,毫秒| 4.000000 | 6.000000 | 7.000000 | 0.547723
每阵列列表字节数| 416.00KB | 416.00KB | 416.00KB | 0.00B
每项字节数| 21.00b | 21.00b | 21.00b | 0.00b
总cpu,ms | 0.000000 | 0.950000 | 1.000000 | 0.217945
每TintraryList的byt | 105.56 KB | 105.56 KB | 105.56 KB | 0.00 B
每项字节数| 5.00b | 5.00b | 5.00b | 0.00b
所以是
LinkedList: 42 bytes
ArrayList: 21 bytes
TIntArrayList: 5 bytes
LinkedList:42字节
ArrayList:21字节
TIntArrayList:5字节
但是,如果阵列列表的大小未知,则由于阵列重新分配而导致的内存消耗为:
LinkedList: 42 bytes
ArrayList: 29 bytes
TIntArrayList: 10 bytes
LinkedList:42字节
ArrayList:29字节
TIntArrayList:10字节
它是一个双链接列表,因此在链接列表中的每个独立链接之前和之后都有一个对节点的引用。链接列表中的每个独立链接都是一个单独的对象,除了链接字段之外,还有一个至少8字节的头,通常为12-16字节。有很多方法可以使用多个数组来“伪造”这一点,但是它们是复杂的,至少我检查过的(旧版本)的Link表没有这样做。有一个OIFF主题,但是考虑使用一个ARAYLIST而不是一个链接表,它使用更少的内存,如果你调用Trimes(),它使用与数组相同的大小(对于列表管理来说,一些常数字节更多)。.s/array list/LinkedList/g
不知道你说的“包装器”是什么意思。每个元素都是一个单独的对象,有一个完整的对象标题。@HotLicks他就是这么说的。示例链表包含Integer
对象,而数组可以直接包含int
s。他指的是包装器对象:int->Integer:4bytes->4+12=16字节。我的意思是每个列表条目本身是一个单独的对象。这与用于“装箱”原语的对象无关——这仍然是额外的开销。