Java Zero Allocation

时间:2015-11-11 18:04:24

标签: java memory memory-management

我多次遇到过“零分配”这个词#34;我正在寻找关于这个问题的一些澄清。

当"零分配"提到,它是指在启动时使用少量分配或分配所有内容的程序,例如?因为在我看来,在一个非平凡的程序中根本不分配任何对象是不可行的,但我可能错了。

另一方面,使用堆外存储器,也被认为是"零分配"在这种情况下,"零分配"是否意味着垃圾收集器没有分配内存?

我在本演讲的背景下第一次听到这个:http://www.infoq.com/presentations/panel-java-performance,大约15:35。

1 个答案:

答案 0 :(得分:1)

如果你有一个非常紧凑和热的循环(即一个循环,在非常短的时间内运行数千甚至数百万次),那么将分配移到循环之外是有意义的。

十年前我用Java编写了一个模拟。在循环中有一个对象列表被操纵。循环每秒运行三十次,应该在30毫秒内完成,然后操作多达五万个对象。困难在于在循环迭代中创建和删除对象。

我们很快意识到我们应该避免对象分配(以及后果垃圾收集)。我们在循环内使用零分配方法解决了这个问题。怎么样?

我们用一系列flyweight对象替换了列表。在循环开始之前分配五万个对象的数组。第二个技巧是使用flyweight模式的变体。我们不是在循环中删除和创建对象,而是从五万个预先分配的对象开始,并添加一个标记以将它们标记为" active"是否"活跃"。每当我们想要删除一个对象时,我们都将其标记为非活动状态。有许多这样的小技巧可以避免分配。

它有帮助!模拟能够实时运行,没有垃圾收集抖动(由于主要的垃圾收集运行导致帧速率突然下降)。

这是一个小例子,向您展示零分配可能如何工作以及为什么需要它。