Java内存碎片和大型数组的分配

时间:2011-10-17 09:29:04

标签: java memory-management

我正在考虑将Timer类用于大量的TimerTasks(比如说一两百万)。 Timer的堆实现是基于数组的,并且由于没有办法为数组保留空间,问题出现了,当内存碎片化时,Java如何处理大型连续内存块(在这种情况下为数组)的分配? / p>

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

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

1 个答案:

答案 0 :(得分:3)

首先,这不是由Java语言规范定义的,因此您将获得的具体答案将取决于实现。我甚至不相信它是在虚拟机规范中定义的。

事实上,我建议您将问题范围缩小到特定的JVM实施

  

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

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