我听说过有些Java程序对延迟要求非常严格,在这些程序中“new”指令很少或从不使用(因为没有new=>没有对象->没有GC=>改善了延迟)...相反,所有业务逻辑都使用基本类型处理。
虽然我无法在网上找到相关的技术参考资料...但如果您能提供任何讨论此技术或代码片段的网页链接,我将不胜感激。
我听说过有些Java程序对延迟要求非常严格,在这些程序中“new”指令很少或从不使用(因为没有new=>没有对象->没有GC=>改善了延迟)...相反,所有业务逻辑都使用基本类型处理。
虽然我无法在网上找到相关的技术参考资料...但如果您能提供任何讨论此技术或代码片段的网页链接,我将不胜感激。
更新(2012年3月):尽管没有公开宣布,但似乎Oracle已关闭其JavaRTS组。
你应该关注两个主题:Java实时规范(JSR-1,JSR-282)和Java安全关键规范(JSR-302), (Aonix页面)。 RTSJ提供了进行仔细内存管理的资源,虽然RTSJ的大多数用户可能会容忍比“全部基元”方法更大的抖动(并且通过使用RTGC来获得GC的好处)。 有关限制分配的一些示例(限制何时/何地/多少次可以使用new
),请搜索“rtsj scoped memory rules”,这里是一个有关此主题的学术论文示例。 您还应该查看“eventrons”,这是在Java中相对干净的方式尝试解决这些高频,低延迟约束的示例。
有关在交易上下文中使用JavaRTS的特定新闻报道,请参见此处。 有关如何在特定情况下获得最确定性行为的一些说明,请参见此处。
安全关键用户更有可能具有此类限制,而SC-Java预计部分是RTSJ的降级版本。您可以在Doug Locke的JTRES 2007状态幻灯片中看到一些专家小组正在研究的示例。
几位人士生产了旨在在此环境中使用的JVM。 Aonix / Atego的PERC; aicas的JamaicaVM; Apogee的Aphelion。Sun / Oracle JavaRTS针对更大的应用程序,可以容忍(并受益于)较少严格的约束。
虽然您所提及的“全部基元”方法是这种类型的编程的极端形式,但您最有可能在上述参考资料之一中找到此主题的资源。
对于我上面的“原语中的业务逻辑?”唱衰者,请注意,IBM汇编语言实现了大量IRS税务业务逻辑,并且正在考虑使用一些“企业”层像Java来包装(而不是替换!)该逻辑。把它放进你的烟斗里吧。
我无法在此引用任何具体信息,但有许多国防应用程序使用Java(通常是RTSJ的一种变体),对内存分配有非常严格的限制,并且大部分代码都是静态分配的,基元聚焦的。信号处理等...我搜索了我了解的系统的开放源代码资料,并且这些文档(特别是参考部分)指引了一些具体示例。
我曾经在许多这样的系统上工作过。如果你需要亚毫秒延迟,你需要考虑创建对象。可以编写一个应用程序,一整天都不会进行垃圾回收,以避免任何垃圾回收延迟。
然而,99%以上的应用程序并不需要这种极端情况。
这避免了动态分配和垃圾回收引入的不可预测性,但仍然允许有限地使用动态内存。
感谢andersoj和mikera为我解释这个问题。
可能有一些交易系统可以做到这一点,但据我了解(我的同事们在基于Java的低延迟交易平台上工作),一个好的快速现代JVM结合合理的编码实践就可以避免在代码中使用“纯粹的原语”。尽管如此,我不是一个低延迟开发人员,我们的中间件团队只关心每分钟的数千个交易,而不是数万个。我还没有找到令人信服的文章,尽管我很乐意惊喜地发现 :)
我曾在游戏编程中使用过这种技术,因为太多的长时间GC延迟会降低用户体验。实践中并不需要消除所有的“new”指令,只需将其保持在合理的水平即可。
一个很好的例子是Javolution库,它使用了很多这些技术,如果你对它的编码方式感兴趣或想要使用支持最小分配操作的现成数据结构和算法,那么它绝对值得一看。