当前位置: 首页 > 面试题库 >

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

殳宸
2023-03-14
问题内容

我们可以拥有任何大小的Java对象而不必担心异常吗?我将使用一个类的对象,该类由ArrayList成千上万个包含HashMaps和ArrayLists以及许多其他非原始类型的其他对象组成。

谢谢


问题答案:

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

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

下面是VM选项,你可以用它来设置堆大小按您的要求(从该java文档):

-Xms ñ

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

       -Xms6291456
       -Xms6144k
       -Xms6m

-Xmx ñ

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

       -Xmx83886080
       -Xmx81920k
       -Xmx80m

从VM
Spec
检查堆信息

3.5.3堆

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

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

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

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



 类似资料:
  • 问题内容: 我有一个字符串定义为 字串xx 我可以分配的字符数有限制吗? 2)我正在将用户输入分配给此字符串xx。70%的人只说一个字。有时他们会说一个大句子,所以想知道可以吗?还是有更好的Java做法? 问题答案: 您可能已经搜索过一个常见问题,但无论如何我都会再次回答。 我可以分配的字符数有限制吗? 它的Integer.MAX_VALUE或2 ^ 31-1或大约20亿。在达到此大小之前,您更有

  • 问题内容: 我正在尝试使用jQuery Ajax将页面中的数据数组发送到MVC Action。这是我的jQuery代码: 让我解释一下。我有一个动态生成的HTML表,我需要将此数据存储到数据库中。在jQuery中,我遍历表有一个循环,我将数组中每一行的数据存储起来。然后,我使用Ajax将这些数据传递到MVC Action中。 这是我的问题开始的地方…我已经意识到有时会按预期进行,但是有时我会从Aj

  • 问题内容: 众所周知,java使用以下数据类型 如果我创建一个像 现在的问题是大小尺寸是。请以适当的理由给我澄清。 谢谢, Anil Kumar C 问题答案: 对象的内存大小取决于体系结构,主要取决于VM是32位还是64位。实际的VM实施也很重要。 对于每个对象,您需要为其对象标头(在64位VM上通常为2 * 8字节),其字段(根据VM的实现需要额外的对齐空间)的空间。然后将最后的空间四舍五入到

  • 问题内容: 对于我的应用程序,Java进程使用的内存远远大于堆大小。 容器运行所在的系统开始出现内存问题,因为容器占用的内存比堆大小大得多。 堆大小设置为128 MB(-),而容器最多占用1GB的内存。正常情况下需要500MB。如果docker容器的限制低于(例如),则该进程将被操作系统的内存不足杀手杀死。 你能解释一下为什么Java进程使用的内存比堆多得多吗?如何正确调整Docker内存限制的大

  • 问题内容: Java虚拟机是否曾经在内存中移动对象,如果是,它将如何处理对移动对象的更新引用? 我问是因为我正在探索一种以分布式方式(即,跨多个服务器)存储对象的想法,但是出于效率方面的考虑,我需要能够在服务器之间移动对象。对象需要能够包含彼此的指针,甚至指向远程服务器上的对象。我正在尝试考虑更新对移动对象的引用的最佳方法。 到目前为止,我的两个想法是: 在对象的整个生命周期中都不会移动的地方保持

  • 问题内容: 我有一个,我想知道它正在使用多少内存。 的是变体是这样,它不是那么容易,因为乘法每一个对象的大小的数组中的元素数目。 问题答案: 您可以使用诸如此类的对象及其对应对象来进行有根据的猜测,但这并不考虑两次调用之间通过GC处理的对象。