【发布时间】:2012-02-17 11:58:43
【问题描述】:
应该只对 POD 数据类型使用 Disruptor 吗?
我的意思是 Disruptor<T> 应该只用于 T 取值如 byte[], int[], etc 吗?
我的疑问是,如果我们使用具有Object 引用作为其成员变量的T,我们需要new 那些将位于堆上的成员变量。
这将再次导致缓存未命中,因为成员变量可能位于堆的完全独立的部分。
那么我认为Disruptor<T> 应该只用于属于一组普通旧数据类型 (POD) 的 T 是否正确?
问候, 虚拟机
更新:其他人可以看看这个问题吗?
更新2:
回复@Trisha
嗨,特丽莎,
您好。
我看到了你提到的链接。
com.lmax.ticketing.api.Message 继承自 javolution.io.Struct 并由来自 javolution.io.Struct 和 javolution.io.Union 的元素组成,这使得 Message 可以在 C/C++ 之间进行互操作
对于从javolution.io.Struct/Union 继承的任何类,内存布局由Struct/Union 的成员的初始化顺序定义,并遵循与C/C++ 结构相同的wordSize 规则。
因此,本质上,您可以控制放入Disruptor 中的元素的内存布局。并且Message 的所有成员和子成员都是固定大小的,即没有任何动态内存(java.lang.Object)
这也是我的观点,我们应该使用我们可以控制内存布局并且没有任何动态内存的元素。这样做是为了最大限度地减少缓存未命中。
假设,如果消息的一部分是java.lang.String,我们不知道 JIT 编译器会将那个字符串放在哪里。如果我正在访问EventHandler 中的Message.String,这可能会导致缓存未命中,因为字符串可能存在于完全不同的内存块中..
我说的对吗?
【问题讨论】:
-
我认为您的问题是有效的,尽管措辞可能有误。我还不相信答案。如果您的事件对象的大小不固定,或者在“新”时间不确定,我看不出如何阻止垃圾收集器。