设置虚拟机内存大小,以增加动态数组List的最大容量

本文通过实验展示了Java List动态数组的实际容量限制,并解释了如何通过调整JAVA虚拟机(JVM)的内存设置来增加List的容量,避免内存溢出错误。

List类似于动态数组,使用的时候不必考虑是否溢出, 可以一直动态增加的。那到底有没有个最大容量呢?有!当然List本身并没有属性或方法来说明最大容量。其最大容量与JAVA虚拟机内存大小有关,如果数组里的数据太多,会造成内存溢出。
我以我的机器测试下,当List里存放871056时,就抛出以下异常。

略....
871052
871053
871054
871055
871056
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 at java.nio.CharBuffer.wrap(CharBuffer.java:350)
 at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:246)
 at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
 at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
 at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
 at java.io.PrintStream.write(PrintStream.java:476)
 at java.io.PrintStream.print(PrintStream.java:561)
 at java.io.PrintStream.println(PrintStream.java:700)
 at SelectMain.selectRedMinMaxSum(SelectMain.java:85)
 at SelectMain.selectRedBall(SelectMain.java:53)
 at SelectMain.main(SelectMain.java:629)

所以需要设置JAVA虚拟机内存大小,增加动态数组List的最大容量。以eclipse开发工具为例
打开eclipse,选择Window--Preferences...在对话框左边的树上双击Java,再双击Installed JREs,在右边选择前面有对勾的JRE,再单击右边的Edit按钮,
出现一个 Edit JRE 的对话框,在其中的Default VM Arguments: 框中输入 -Xms512m -Xmx1024m ,这样设置Java拟虚机内存使用最小是512M,最大是1024M,再单击OK关闭Edit JRE 对话框,如下所示


扩展阅读
Java虚拟机(JVM)中的内存设置详解:http://developer.51cto.com/art/200906/127144.htm





<think>我们正在讨论JavaList的最大长度限制。根据引用[1],ArrayList最大容量通常是Integer.MAX_VALUE-8,因为某些虚拟机数组中保留了一些头信息。尝试分配更大的数组可能会导致OutOfMemoryError。LinkedList理论上只受内存限制,但实际中也会受限于整数索引的最大值(即Integer.MAX_VALUE)。在Java中,List接口有两种常见的实现:ArrayList和LinkedList。它们对最大容量的限制有所不同。1.**ArrayList**:基于数组实现。数组的最大长度在Java中受限于int类型的最大值(即2147483647),但由于一些虚拟机实现的原因,ArrayList的源码中定义了一个常量`MAX_ARRAY_SIZE=Integer.MAX_VALUE-8`(2147483639)。尝试创建更大的数组可能会导致`OutOfMemoryError`。当数组容量达到这个最大值时,再尝试添加元素就会抛出异常。2.**LinkedList**:基于双向链表实现。理论上,链表的长度只受可用内存的限制,但是由于List的索引是int类型,所以实际的最大长度也不能超过Integer.MAX_VALUE(2147483647)。当链表大小超过这个值时,索引操作(如get(intindex))将无法使用,因为索引值会溢出。但是,在添加元素时,只要内存足够,可以一直添加直到达到Integer.MAX_VALUE个元素,再添加第2147483648个元素时,由于大小用int存储,会溢出变为负数,从而引发异常。另外,其他List实现类(如Vector)也有类似ArrayList的限制。因此,在回答用户问题时,需要区分不同的List实现,并指出实际限制因素(数组实现有最大数组大小限制,链表实现则受限于索引的最大值,但两者都受内存限制)。现在,我们按照要求生成相关问题。</think>### JavaList的最大长度限制 在Java中,List的最大长度限制主要取决于其实现类和底层数据结构,关键限制因素包括: #### 1. **ArrayList最大容量** - 底层基于数组实现,源码中定义了最大数组长度常量: ```java private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; ``` - **理论极限**:$2^{31}-1 = 2147483647$(`Integer.MAX_VALUE`) - **实际限制**:$2147483639$(`Integer.MAX_VALUE - 8`) - 超出限制时抛出`OutOfMemoryError: Requested array size exceeds VM limit`[^1] - *原因*:JVM数组头部保留8字节存储元数据(如数组长度、类型信息) #### 2. **LinkedList的限制** - 底层基于双向链表,理论上只受内存大小限制 - 但受`int`索引范围约束($-2^{31} \sim 2^{31}-1$) - 添加超过 $2147483647$ 个元素时,`size`计数器溢出变为负数,导致操作异常[^2] #### 3. 其他限制因素 - **内存容量**:实际最大长度受JVM堆空间限制,可通过`-Xmx`参数调整 - **数据结构**: - `CopyOnWriteArrayList` 限制同`ArrayList` - `Vector` 限制机制类似但线程安全 #### 4. 突破限制的方法 ```java // 分段存储(例如使用List<List<T>>) List<List<Integer>> chunkedList = new ArrayList<>(); chunkedList.add(new ArrayList<>(MAX_ARRAY_SIZE)); ``` > **注意**:即使分段存储,总元素数仍受`long`类型限制($2^{63}-1$),但实际场景极少达到 ### 总结对比表 | List实现类 | 理论最大长度 | 实际典型限制 | 溢出表现 | |-------------|-------------|-------------|----------------------| | ArrayList | $2^{31}-1$ | $2^{31}-9$ | `OutOfMemoryError` | | LinkedList | $2^{31}-1$ | 无固定上限 | `size`负值,操作异常 | | Vector | $2^{31}-1$ | $2^{31}-9$ | 同ArrayList | 实际开发中,达到数亿元素时需考虑: 1. 使用分布式存储(如Redis) 2. 改为数据库分页查询 3. 优化数据结构(如布隆过滤器)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值