java中的对象是否有任何内存大小限制?

时间:2010-09-01 12:49:59

标签: java collections

我们可以拥有任何大小的Java对象而不必担心异常吗?我将使用一个类的对象,该类包含ArrayList成千上万的其他对象,这些对象包含HashMapArrayList s以及许多其他非基本类型的对象。

谢谢

7 个答案:

答案 0 :(得分:13)

如果你有一个引用A的对象(我称之为ArrayList),其中包含许多很多对象,A的“大小”仍会相当小(引用的大小加上一点开销)。 A引用的对象几乎与A无关。唯一的限制是所有对象的总大小受可用内存的限制。

唯一真正“巨大的对象”是一个有很多很多字段的对象,但是JLS / JVM规范设置了一个非常小的限制(fields_count in the class file format是一个u2字段,所以你可以最多有65 535个字段。)

答案 1 :(得分:4)

Java堆是系统中可以拥有的对象大小的限制。如果对象的大小超出堆,则会生成Out Of Memory错误。

在您的情况下,您的总对象的大小(ArrayList中的对象+系统中的其他对象)更重要,因为您的ArrayList只是引用这些对象。

以下是可根据您的要求设置堆大小的VM选项(来自the java documentation):

  

-Xms 名词

     

指定初始大小(以字节为单位)   内存分配池。这个值   必须是1024倍的倍数   超过1MB。将字母k或K附加到   表示千字节,或m或M表示   表示兆字节。默认值   是2MB。例子:

       -Xms6291456
       -Xms6144k
       -Xms6m
     

-Xmx 名词

     

指定的最大大小(以字节为单位)   内存分配池。这个值   必须是1024的倍数大于   2MB。将字母k或K附加到   表示千字节,或m或M表示   表示兆字节。默认值   是64MB。例子:

       -Xmx83886080
       -Xmx81920k
       -Xmx80m

检查VM Spec

中的堆信息
  

3.5.3堆

     

Java虚拟机具有在所有Java虚拟机>线程之间共享的堆。堆是运行时数据区,从中分配所有类实例和>数组的内存。   堆是在虚拟机启动时创建的。对象的堆存储由>自动存储管理系统(称为垃圾收集器)回收;对象永远不会被>显式释放。 Java虚拟机假设没有特定类型的自动>存储管理系统,并且可以根据实现者的系统要求来选择存储管理技术。堆可以是固定大小的,或者可以根据计算的需要进行扩展,并且如果更大的堆变得不必要则可以收缩。堆的内存不需要是连续的。

     

Java虚拟机实现可以为程序员或用户提供对堆的初始大小的控制,以及如果堆可以动态扩展或收缩,则控制最大和最小堆大小0.5

     

以下异常情况与堆相关联:

     

如果计算需要的堆数超过自动存储管理系统可用的堆,则Java虚拟机会抛出OutOfMemoryError。

答案 2 :(得分:0)

如果没有影响,你不能使用任何大小的物体。您可以编写您喜欢的代码,但显然您需要了解JVM以及其中使用的典型内存/堆限制。

答案 3 :(得分:0)

唯一的限制因素是最大堆大小,我在内存数据库中也只有100MB胖对象。

答案 4 :(得分:0)

当然它有内存限制约束。但是,您可以通过初始化为更大的大小来控制堆内存。但这并不能保证你可以随意使用无限的内存。

答案 5 :(得分:0)

总堆限制是主内存约束。只要你的物体适合这个,你就可以了。

如果您愿意,可以通过分配大量数组并观察何时获得OutOfMemoryErrors来测试它。

由于整数索引的大小,还有一个数组大小限制为2147483647。从来没有真正看到有人在实践中遇到过它。

答案 6 :(得分:0)

对象的内存大小基于堆内存的大小。对象可以保存堆内存的大小。请参阅链接。http://javarevisited.blogspot.in/2011/05/java-heap-space-memory-size-jvm.html