0

我试图了解 lmax 干扰器如何对 GC 友好。我看到环上的事件对象被重复使用,但是,在这些对象上“设置”的“数据”在堆上,所以感觉垃圾收集的好处仅限于每个事件少 1 个对象。如果“数据”是原始数据类型,那么堆上没有任何额外内容,因此在这种情况下的好处非常明显。每个事件对 GC 的重要性是否减少 1 个对象,或者这比我对 GC 的理解要多。

这篇文章http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html垃圾收集器在这里几乎没有什么可做的——这对我来说不是很明显,因此是这个问题。

4

1 回答 1

1

环形缓冲区充当对象池 - 当您声明一个序列时,您可以将数据复制到事件中,并且当所有事件处理程序完成处理时,事件将再次返回到环形缓冲区。

诀窍是确保将数据复制到事件中,因此事件可以保存您可能希望在生产者和消费者之间进行通信的所有不同类型的数据。如果你只是在生产者端的堆上分配一个对象,并将对该对象的引用传递给事件,那么显然你根本不会减少 GC 上的内存压力。

另一种方法是有一个事件,它只是一些堆外内存的偏移量,可以通过使用享元来解释为不同类型的对象。

于 2021-02-03T23:03:36.063 回答