Java内存碎片和大型阵列的分配

Java内存碎片和大型阵列的分配,java,memory-management,Java,Memory Management,我正在考虑将Timer类用于大量TimerTask,比如说一百万或两百万。计时器的堆实现是基于数组的,由于无法为数组保留空间,因此出现了一个问题:在这种情况下,当内存被碎片化时,Java如何为数组分配大型连续内存块 如果没有足够大的可用片段,是否总是抛出OutOfMemoryError?或者,当空闲内存总量足够时,我可以期望JVM采用某种内存去碎片化策略吗 编辑:我的问题似乎没有与JVM实现无关的答案。在我的例子中,根据java.vm.name和java.vm.version系统属性,JVM实现

我正在考虑将Timer类用于大量TimerTask,比如说一百万或两百万。计时器的堆实现是基于数组的,由于无法为数组保留空间,因此出现了一个问题:在这种情况下,当内存被碎片化时,Java如何为数组分配大型连续内存块

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


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

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

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

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

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