Java内存碎片和大型阵列的分配
我正在考虑将Timer类用于大量TimerTask(比如说100万或200万)。Timer的堆实现是基于数组的,由于没有办法为数组保留空间,因此出现了一个问题:当内存被碎片化时,Java如何处理大型连续内存块(在本例中,对于数组)的分配
如果没有足够大的可用片段,是否总是抛出OutOfMemory错误?或者,当空闲内存总量足够时,我能指望JVM采用某种内存去碎片化策略吗
编辑:我的问题似乎没有独立于JVM实现的答案。在我的例子中,JVM实现是OpenJDK版本14.0-b16(根据java.vm.name和java.vm.version系统属性)
# 1 楼答案
首先,这不是Java语言规范所定义的,所以您将得到的任何具体答案都将取决于实现。我甚至不相信它是在虚拟机规范中定义的
事实上,我建议您将问题缩小到特定的JVM实现
因为Java隐藏了实际的内存地址,所以它可以随意执行memory compaction。所以是的,你可以期待它有内存碎片整理策略。(请记住,您的操作系统可能为JVM提供了虚拟内存,因此在应用程序和物理地址之间还有另一层。)