我们可以拥有任何大小的Java对象而不必担心异常吗?我将使用一个类的对象,该类由ArrayList
数千个其他对象组成,这些对象包含HashMap
s和ArrayList
s的耦合以及许多其他非基本类型.
谢谢
Joa*_*uer 13
如果你有一个对象(让我们称之为A
)引用一个ArrayList
包含许多对象的对象,那么"大小" A
仍然会相当小(引用的大小加上一些开销).引用的对象A
几乎独立于A
.唯一的限制是所有对象的总大小受可用内存的限制.
唯一真正"巨大的对象"将是具有许多字段的那个,但是JLS/JVM规范设置了一个非常小的限制(fields_count
类文件格式是一个u2
字段,因此最多可以有65 535个字段).
Java 堆是系统中可以拥有的对象大小的限制。如果对象的大小超出堆,则会生成内存不足错误。
在你的情况下,你的总对象的大小(ArrayList中的对象+系统中的其他对象)更重要,因为你的ArrayList只是引用这些对象。
以下是可用于根据您的要求设置堆大小的 VM 选项(来自文档)java
:
-Xms
n指定内存分配池的初始大小(以字节为单位)。该值必须是大于 1MB 的 1024 的倍数。附加字母 k 或 K 表示千字节,或附加 m 或 M 表示兆字节。默认值为 2MB。例子:
-Xms6291456 -Xms6144k -Xms6米
-Xmx
n指定内存分配池的最大大小(以字节为单位)。该值必须是 1024 的倍数且大于 2MB。附加字母 k 或 K 表示千字节,或附加 m 或 M 表示兆字节。默认值为 64MB。例子:
-Xmx83886080 -Xmx81920k -Xmx80米
从VM Spec检查堆信息
3.5.3 堆
Java 虚拟机有一个堆,在所有 Java 虚拟机 > 线程之间共享。堆是运行时数据区域,所有类实例和>数组的内存都从这里分配。堆是在虚拟机启动时创建的。对象的堆存储由自动存储管理系统(称为垃圾收集器)回收;对象永远不会>显式地释放。Java虚拟机不假设特定类型的自动存储管理系统,并且可以根据实现者的系统要求来选择存储管理技术。堆可以是固定大小的,或者可以根据计算的需要进行扩展,并且如果不需要更大的堆,则可以收缩。堆的内存不需要是连续的。
Java 虚拟机实现可以为程序员或用户提供对堆初始大小的控制,以及(如果堆可以动态扩展或收缩)对最大和最小堆大小的控制。5
以下异常情况与堆相关:
如果计算需要的堆多于自动存储管理系统所能提供的堆,Java 虚拟机将抛出 OutOfMemoryError。
归档时间: |
|
查看次数: |
3191 次 |
最近记录: |