我们可以拥有任何大小的Java对象而不必担心异常吗?我将使用一个类的对象,该类包含ArrayList
成千上万的其他对象,这些对象包含HashMap
和ArrayList
s以及许多其他非基本类型的对象。
谢谢
答案 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