有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在考虑将Timer类用于大量TimerTask(比如说100万或200万)。Timer的堆实现是基于数组的,由于没有办法为数组保留空间,因此出现了一个问题:当内存被碎片化时,Java如何处理大型连续内存块(在本例中,对于数组)的分配

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

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


共 (1) 个答案

  1. # 1 楼答案

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

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

    Will an OutOfMemoryError always be thrown if there is no fragment available big enough? Or can I expect the JVM to have some kind of memory de-fragmentation strategy when the total amount of free memory is enough?

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