【问题标题】:Arrays and Linked List : will arrays be able to allocate 300MB in memory if 512 MB is free but 300 MB is not contiguous数组和链表:如果 512 MB 可用但 300 MB 不连续,数组是否能够在内存中分配 300 MB
【发布时间】:2014-03-30 19:44:57
【问题描述】:

我有一个关于数组和链表的概念性问题。

数组是一块连续的内存。

假设一个系统有 1024 个内存单元。 512 个单元被占用(系统+其他)。

我们的流程需要 300 个单位。

在内存中有 512 个可用单元时,最大连续块是 200 个单元。所以可能有 1 个 200 个单元的块,3 个 100 个单元。

  1. Java 等语言中的数组分配会发生什么情况。在 C 中,malloc 应该会失败?
  2. 如果底层数据结构是链表,它应该能够轻松处理不连续的性质(我在这个假设中是否正确)?

  3. 操作系统会“碎片整理”内存或其他类似的东西吗?

内存是指内存。不是硬盘。

【问题讨论】:

  • 这取决于你所说的“记忆”是什么意思。如果是碎片化的物理内存,操作系统提供的虚拟内存系统应该隐藏它。
  • 我想我的意思是,物理内存。虚拟内存也基于磁盘进行抽象。所以要理解它,我想知道会发生什么。它是否会将内存内容写入磁盘并再次加载它们,但会创建一个 300 个单元的连续块?
  • 操作系统永远不会对内存进行碎片整理。它支持虚拟内存,永远不必担心此类问题..

标签: java arrays memory memory-management linked-list


【解决方案1】:

嗯,它在某种程度上是特定于实现的,但我希望 JVM 实现通过分配一个连续的内存块来初始化数组。我不认为这是绝对必要的,但它将是迄今为止最有效的方法。

如果内存在所需的形式中不可用,JVM 将抛出 OutOfMemoryError,根据 JLS 的第 15.10.2 节:

接下来,为新数组分配空间。如果没有足够的空间来分配数组,则数组创建表达式的计算会通过抛出 OutOfMemoryError 突然完成。

(但是,JVM 应该首先尝试安排足够的空间 - 例如,在抛出错误之前运行垃圾收集和压缩。)

是的,链表可以解决这个问题——但无论如何它都需要更多的内存,因为要创建所有额外的对象。如果您的 300MB 内存需求实际上是 3 亿字节,并且您创建了一个 LinkedList<Byte>,那么由于所有对象和引用的开销,尝试创建 3 亿个节点将会失败。

至于“碎片整理”——许多 JVM 都有“压缩”垃圾收集器,它们在内存中移动对象以避免碎片。别忘了这都是虚拟内存——它不需要物理上是连续的。这部分由操作系统处理,我们很少需要担心。

【讨论】:

  • 我想我想了解的部分是,如果连续块不可用会发生什么(内存有物理限制)。 JVM 做什么?假设 JVM 可以访问操作系统允许的最大值(并且 300 小于该限制)。它是如何处理数组分配的?
  • @Nasir:如果内存不可用,则抛出OutOfMemoryError
  • 谢谢。这就是我想知道的。即使内存可用,但不在一个连续的块中。所以OutOfMemoryError 被抛出。
  • @Nasir:是的。这是关于以 JVM 需要的方式可用的内存。
  • 具有压缩 GC 的智能 JVM可以运行完整的垃圾回收周期。
猜你喜欢
  • 2021-05-21
  • 2015-03-28
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 2015-08-02
相关资源
最近更新 更多