Java 中数组的最大长度是多少呢?看一下它的length属性就可以了。length属性是32位的有符号整数,它的最大值是2的31次幂,就是2G。
为什么length的属性不是long型呢?我们假设一下,如果它是long型的,那么它的最大长度是2的63次幂。内存永远也不会有那么大吧。即使是字节数组长度是int的,最大长都达到2GB.
list从语言上来看,java.util.List是个接口,其下有N多实现,最常用的是ArrayList和linkedList及其各种继承或同步化实现(如Vector/Queue/Stack这些的)
- ArrayList内部是拿数组存储,那么上限就是Integer.MAX_VALUE
- linkedList内部是个链表,理论上是无限的。
另外,List里放的东西都是在内存里的(当然你也可以自己实现一个放磁盘上的),因此能放多少也取决于放的东西的大小以及种类。
大小方面很容易计算,一个对象如果1K,那400,000个就至少要占用400M的内存(不算其他占用)。
而虚拟机内存分类方面,如果是普通对象,一般占用的都是堆(Heap)空间,如果是常量或是类似String.intern()出来的东东,则占用的是永生代(Permanent Generation)。
StringString底层也是基于数组的,是一个字符数组。
private final char value[];
在指定数组长度的时候,可以使用 byte、short、char、int 类型,而不能够使用 long 类型。这也就是说,数组的最大长度就是 int 类型的最大值
java.lang.String#length() 源码: public int length() { return value.length;}
一个数组最大的长度是一个 int 的最大值,也就是 2147483647,而一个字符串在 Java 内部是使用 char[] 来表示的,也就是说一个字符串的最大长度是 2147483647。
public class StringTest { public static void main(String[] args) { for (int i = 0; i < 100; i++) { int len = Integer.MAX_VALUE - i; try { char[] ch = new char[len]; System.out.println("len: " + len + " OK"); } catch (Error e) { System.out.println("len: " + len + " " + e); } } } } len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limit len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit len: 2147483645 OK len: 2147483644 OK len: 2147483643 OK 产生这个错误的原因就是内存溢出,也就是系统无法分配这么大的内存空间所致。 计算一下,一个 char 类型占用 2 字节,2147483647 个 char 类型就是 4294967294 字节,这接近于 4GB 大小,想要申请这么一大块连续的内存空间,失败也就不足为奇了。
不过这些都是理论值,具体能放多少与 JVM 内存有关, 可以在执行 java 命令时加上 -Xmx 1024m 就将 JVM 内存最大置为了 1G, 默认情况下是 64MB.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)