仅使用基元编码的java程序的引用

我听说过具有严格延迟要求的Java程序,其中“新”指令永远不会 – 或者很少使用(因为没有新的=>没有对象 – >没有GC =>改进的延迟)…而是处理所有业务逻辑使用原语。

我无法在网上找到对这种技术的引用…任何链接到讨论这种技术的网页或代码片段都将非常感激。

更新(2012年3月):虽然没有公开声明,但似乎Oracle已关闭其JavaRTS组。

您应该看到的两个主题是Java的实时规范 (JSR-1, JSR-282 )和Java的安全关键规范(JSR-302) ,( aonix页面 )。 RTSJ提供了在你的问题中进行仔细memory management的资源,尽管RTSJ的大多数用户可能容忍比“全原语”方法更大的抖动(并且,对于这种容忍,他们得到了通过使用RTGC获得GC的好处。 对于有限分配类型的一些示例(限制何时/何地/可以使用new )搜索“rtsj范围内存规则”,这里是关于该主题的示例学术论文 。 您还应该将“eventrons”视为尝试以(相对)干净的方式解决Java中的这些高频率,低延迟约束的示例。

有关在交易环境中使用JavaRTS的特定新故事,请参见此处 。 有关如何从JavaRTS中获取最具确定性的行为的一些说明,请参见此处 。

安全关键用户更有可能受到这些限制,而SC-Java(预期)部分是RTSJ的缩小版本。 您可以在Doug Locke的2007年JTRES状态幻灯片中看到专家组正在查看的一些示例。

有些人生产用于此环境的JVM。 Aonix / Atego的PERC ; 艾卡斯’牙买加VM ; Apogee的Aphelion 。 Sun / Oracle JavaRTS更多地针对可以容忍(并受益于)不太严格的约束的大型应用程序。

虽然您引用的“全原语”方法是此类编程的一种极端forms,但您最有可能在上述参考文献中找到有关此主题的资源。

对于“原语中的业务逻辑?” 在我之上的反对者,请注意在IBM汇编程序中实现了大量的IRS税务业务逻辑,并且正在考虑使用Java等许多“企业”层来包装(而不是替换!)该逻辑。 把它放在你的烟斗里吸烟吧。

我不能在这里引用任何细节,但有许多使用Java的防御应用程序(通常是RTSJ的一种)对内存分配有非常严格的限制,而且大部分代码都是静态分配的,原始的。 信号处理等…我在我所知道的系统上搜索了开源材料,这些文档(特别参见参考文献部分)指出了这些应用程序的一些具体示例。

  • http://www.aicas.com/papers/scj.pdf
  • http://www.cs.purdue.edu/homes/jv/pubs/safecert09.pdf
  • AN / FPS-85 SpaceTrack雷达: http : //unix.org.in/2010/10/sun-java-real-time-system-selected-for-space-surveillance-radar-java-technology-enables-real-时间行为和吞吐量/和http://www.globalsecurity.org/space/systems/an-fps-85.htm
  • 陆军FCS: http : //www.militaryaerospace.com/index/display/article-display/234337/articles/military-aerospace-electronics/volume-16/issue-8/news/aonix-hard-real-time-java -技术-有用换命令和control.html

我曾参与过许多这样的系统。 如果需要亚毫秒延迟,则需要担心创建对象。 可以编写一整天不使用GC的应用程序,以避免任何GC延迟。

但是,99%以上的应用程序不需要这种极端。

查看Java的实时规范 。

虽然它的配置规则相当复杂。

不,我从来没有听说过这样的程序,甚至是技术。

这似乎是一个坏主意,因为那时你实际上只限于你可以用C或类似的低级语言做什么。 如果你想要这样,用C语言编写就更容易。另外,有很多方法可以避免长时间的GC暂停,实际上大多数低延迟要求都可以满足它们。

另外,为了做任何有用的事情,你将不得不使用Java平台API或其他第三方库,它们可能会在你背后分配大量的对象,因此避免所有对象实例化在非 – 通过计划。

所以我相当肯定这是一个都市传奇,或者至多是一个小众的想法。

编辑:

该技术用于获得实时或低延迟行为。 现在它可能因为更好的GC算法而过时,但这当然取决于环境。 因此,至少对于算法的热点来说,可能需要考虑这个问题。

举个例子:

许多Java实时环境对对象创建施加了一些限制。 这并不意味着它们只能使用原语:仍然可以使用复杂对象,但是例如Safety Critical Java( http://www.aicas.com/papers/scj.pdf )要求所有对象实例化都在初始化阶段。 应用程序运行后(“任务阶段”),不再允许实例化,因此您必须使用您拥有的对象实例。

这避免了动态分配和垃圾收集引入的不可预测性,但仍允许使用动态内存(以有限的方式)。

感谢andersoj&mikera向我解释这个问题。

可能有一些交易系统可以做到这一点,但根据我的理解(我的同事在基于Java的低延迟交易平台上工作),一个好的快速现代JVM结合合理的编码实践消除了在代码中寻找“纯原语”的需要。 这就是说我不是一个低延迟的开发人员,我们的中间件团队只担心每分钟1000的txn,而不是10,000的+。 不能说我已经找到了一篇令人信服的文章,虽然我很高兴能够惊喜:)

我在游戏编程中使用了这种技术,其中太长的GC延迟会降低用户体验。 在实践中,没有必要消除所有“新”指令,只需将它们保持在合理的水平。

使用大量这些技术的库的一个很好的例子是Javolution – 如果您对编码方式感兴趣或想要使用现成的数据结构和算法来支持最小分配操作,那么值得一看。