Java 中一个保存了 1 万个整数的 ArrayList 占多少内存?

查看 89|回复 8
作者:61162833   
代码:
List[I] ints=new ArrayList();
for(int i=0;i<10000;i++){
ints.add(i);
}
gpt-3.5 的回答:
在 64 位的 Java 虚拟机中,一个空的 ArrayList 对象通常占用 24 字节。
在 Java 中,一个 Integer 对象通常占用 16 字节(在 32 位和 64 位的 Java 虚拟机中都是如此)。
在 64 位的 Java 虚拟机中:
ArrayList 对象本身:24 字节
整数对象:16 字节 × 10000 = 160000 字节
总内存占用:24 字节 + 160000 字节 = 160024 字节
也就是说,一个仅保存了 1 万个整数的 ArrayList 就要占 160KB 服务器内存?
一个保存了 10 万个整数的 ArrayList 就要占 1.6MB 内存?
怎么与实际感觉似乎不太相符,
有能用 gpt 4.0 的富哥问下这答案对吗?
另外,ArrayList 中保存的整数占内存数与数字大小有关系吗?(比如保存 1 万个 1 亿+的数字,与保存 1-10000 有区别吗?)

arraylist, 字节, Java, 整数

cubecube   
gpt 回答是正确的
和数字大小没关系,int 最大 21 亿
yfugibr   
不止,ArrayList 的空间分配不是要多少就分配多少,而是在容量填满后扩充到之前的大约 1.5 倍(可以去看具体实现),你存 a 个对象,但它分配的空间可能多达 1.5a 个
61162833
OP
  
@cubecube 谢谢,这么一算感觉内存很不经用啊,保存几十万个数字就要爆了
61162833
OP
  
@yfugibr 就是保存 100 个数字要占 150 个数字的内存空间?
rabbbit   
ArrayList 可以设定初始容量值,避免自动扩容。
int 占 4 字节
嫌多还有 short 2 字节 byte 1 字节
humpy   
可以用 [JOL]( https://github.com/openjdk/jol) 工具测一下:
System.out.println(GraphLayout.parseInstance(ints).toFootprint());
---
java.util.ArrayList@5679c6c6d footprint:
COUNT AVG SUM DESCRIPTION
1 40016 40016 [Ljava.lang.Object;
10000 16 160000 java.lang.Integer
1 24 24 java.util.ArrayList
10002 200040 (total)
在我的机器上( 64 位 JDK8 ),大约 200040 / 1024 = 195kb
yeqizhang   
没啥不相符合的,首先高并发的项目,出现大集合的情况少,其次集群下,单台机的业务并发也不会太高,有高并发的业务都堆机器堆内存去了。
还有就是,只要变成垃圾变的快,jvm 回收了也没啥压力。
yfugibr   
@61162833 #4 不是这个意思,ArrayList 底层存储是数组,有一个初始容量(不确定是多少),会在数组被填满时建一个新数组替换旧数组来扩充容量,新数组的容量大约是之前的 1.5 倍(取决于具体实现),直到新数组再次被填满时再次扩容,所以多数情况下都是有空间“浪费”的,但是浪费了多少要看你的存入的容量和 ArrayList 的实现。
当然你也可以直接指定 ArrayList 的容量,这部分就自行搜索吧。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部