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

ArrayList的内存分配如何工作?

黎曾笑
2023-03-14
问题内容

据我所知,当我们创建一个时ArrayList

ArrayList<String> list = new ArrayList<String>(SIZE);

JVM为此保留了内存的连续部分。当我们将新元素添加到列表中时,当元素数量达到75%时,SIZE它将保留新的连续内存部分并复制所有元素。

我们的名单越来越大。我们正在添加新对象,并且必须再次重建列表。

现在会发生什么?

JVM正在寻找连续的内存段,但是找不到足够的空间。

垃圾收集器可以尝试删除一些未使用的引用和碎片整理内存。如果JVM在此过程之后无法为列表的新实例保留空间,该怎么办?

是否使用最大可能的细分创建一个新的细分?哪个Exception会抛出?

引用不会占用太多空间。但无论如何,都会占用一些空间。当数组变大时,可能会出现问题。我们也不能忘记,我们还有其他使用内存空间的东西。


问题答案:

如果JVM无法分配请求的内存量,它将抛出

OutOfMemoryError

而已。实际上,JVM内存分配只有两种可能的结果:

  1. 应用程序已获得请求的内存量。
  2. JVM抛出OutOfMemoryError。

没有中间选项,例如分配了 一些内存

它与 ArrayList 无关,这是JVM问题。如果您问 ArrayList 是否以某种特殊的方式来管理这种情况-答案是“不,不是。”
它只是尝试分配所需的内存量,然后让JVM考虑其余部分。



 类似资料:
  • 据我所知,当我们创建时: JVM为其保留一部分连续的内存。当我们向列表中添加新元素时,当元素数量达到大小的75%时,它会保留一个新的连续内存部分并复制所有元素。 我们的名单越来越大。我们正在添加新对象,必须再次重建列表。 现在发生了什么? JVM正在寻找连续的内存段,但找不到足够的空间。 垃圾收集器可以尝试删除一些未使用的引用并对内存进行碎片整理。如果在此过程之后JVM无法为list的新实例保留空

  • 问题内容: 我需要存储大量信息,例如在Java List中存储“名称”。项目的数量可以更改(或者简而言之,我无法预定义大小)。我认为从内存分配的角度来看,LinkedList比ArrayList更好,对于ArrayList,一旦达到最大大小,内存分配将自动加倍,因此总有可能分配比需要什么。 我从这里的其他文章中了解到,存储在LinkedList中的各个元素比ArrayList占用更多的空间,因为L

  • 我在运行OSX 10.13.6的Mac上有PHP版本7.2.9。如果我加载phpinfo(),我在Safari中看到memory_limit=256M。然而,当我看php.ini(/usr/本地/php5/lib/php.ini)memory_limit=128M。这种差异的原因是什么——显然限制是在其他地方设定的,但是在哪里?我需要增加内存限制

  • 我在理解JVM进程如何分配自己的内存方面有一点差距。据我所知 其中堆外由线程堆栈、直接缓冲区、映射文件(库和JAR)和JVM代码本身组成; 目前,我正在尝试分析我的Java应用程序(Spring Boot Infinispan),RSS779M(它在docker容器中运行,所以pid 1是可以的): 换句话说,我想解释799M-(374M 89M)=316M堆外内存。 这些线程中的每一个都消耗1M

  • 问题内容: ArrayList在内部使用什么数据结构? 问题答案: 内部使用。 在向中添加项目时,列表会检查后备阵列是否还有剩余空间。如果有空间,则将新项目添加到下一个空白处。如果没有空间,则会创建一个更大的新阵列,并将旧阵列复制到新阵列中。 现在,还有更多空间,新元素将添加到下一个空白空间。 由于人们真的很喜欢源代码: 直接跳出JDK。

  • 问题内容: 这是一篇受此评论启发的帖子,内容涉及如何在CPython中为对象分配内存。最初,这是在创建列表并将其添加到for循环中_以_ 实现列表理解的上下文中。 所以这是我的问题: CPython中有多少个不同的分配器? 每个功能是什么? 什么时候被正式称为?(根据此评论中的内容,列表理解可能不会导致调用, python在启动时会为其分配多少内存? 是否有规则来控制哪些数据结构在此存储器上首先获