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

R. *_*hul 8 java collections

我们可以拥有任何大小的Java对象而不必担心异常吗?我将使用一个类的对象,该类由ArrayList数千个其他对象组成,这些对象包含HashMaps和ArrayLists的耦合以及许多其他非基本类型.

谢谢

Joa*_*uer 13

如果你有一个对象(让我们称之为A)引用一个ArrayList包含许多对象的对象,那么"大小" A仍然会相当小(引用的大小加上一些开销).引用的对象A几乎独立于A.唯一的限制是所有对象总大小受可用内存的限制.

唯一真正"巨大的对象"将是具有许多字段的那个,但是JLS/JVM规范设置了一个非常小的限制(fields_count类文件格式是一个u2字段,因此最多可以有65 535个字段).

  • 该死的我只是设计了一个65536字段的对象:( (10认同)
  • @fish:那不是设计,那是一次意外;-) (4认同)

YoK*_*YoK 4

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

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

以下是可用于根据您的要求设置堆大小的 VM 选项(来自文档java

-Xmsn

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

       -Xms6291456
       -Xms6144k
       -Xms6米

-Xmxn

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

       -Xmx83886080
       -Xmx81920k
       -Xmx80米

从VM Spec检查堆信息

3.5.3 堆

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

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

以下异常情况与堆相关:

如果计算需要的堆多于自动存储管理系统所能提供的堆,Java 虚拟机将抛出 OutOfMemoryError。