【问题标题】:Java memory fragmentation and allocation of large arraysJava内存碎片和大数组分配
【发布时间】:2011-12-09 03:49:48
【问题描述】:

我正在考虑将 Timer 类用于大量 TimerTask(比如一两百万)。 Timer 的堆实现是基于数组的,由于没有办法为数组预留空间,问题来了,当内存碎片化时,Java 如何处理大的连续内存块的分配(本例中为数组)?

如果没有足够大的可用片段,是否总是抛出 OutOfMemoryError ?或者当可用内存总量足够时,我可以期望 JVM 有某种内存碎片整理策略吗?

编辑: 我的问题似乎没有独立于 JVM 实现的答案。就我而言,JVM 实现是 OpenJDK 版本 14.0-b16(根据 java.vm.name 和 java.vm.version 系统属性)。

【问题讨论】:

    标签: java memory-management


    【解决方案1】:

    首先,Java 语言规范没有对此进行定义,因此您将获得的任何具体答案都将取决于实现。我什至不相信它是在虚拟机规范中定义的。

    事实上,我建议您将问题缩小到特定的 JVM 实现。

    如果没有足够大的可用片段,是否总是抛出 OutOfMemoryError?或者当可用内存总量足够时,我是否可以期望 JVM 有某种内存碎片整理策略?

    由于Java隐藏了实际的内存地址,它可以随意执行memory compaction。所以是的,您可以期望它具有内存碎片整理策略。 (请记住,您的操作系统可能为 JVM 提供了虚拟内存,因此您的应用程序和物理地址之间还有另一层。)

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 2010-11-26
      • 2013-12-24
      • 2013-08-14
      • 2011-07-25
      相关资源
      最近更新 更多