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

时间:2010-11-01 15:22:55

标签: java garbage-collection real-time

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

我无法在线找到对此技术的引用...任何指向讨论此技术或代码片段的网页的链接都将非常感激。

6 个答案:

答案 0 :(得分:14)

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

您应该看到的两个主题是Real-Time Specification for Java(JSR-1,JSR-282)和Safety-Critical Specification for Java (JSR-302),(aonix page)。 RTSJ提供了在你的问题中进行仔细记忆管理的资源,尽管RTSJ的大多数用户可能容忍比“全原语”方法更大的抖动(并且,对于这种容忍度,他们得到了通过使用RTGC获得GC的好处。有关限制分配的一些示例(限制何时/何地/可以使用new的次数)搜索“rtsj范围内存规则”,这里是example academic paper on the topic。您还应该将"eventrons"作为尝试以(相对)干净的方式解决Java中的这些高频率,低延迟约束的示例。

关于使用JavaRTS in trading contexts, see here的特定新故事。有关如何获得最多deterministic behavior out of JavaRTS in particular, see here的一些说明。

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

有些人会生成用于此环境的JVM。 Aonix/Atego's PERC; aicas' JamaicaVM; Apogee's Aphelion。 Sun / Oracle JavaRTS更多地针对可以容忍(并受益于)不太严格的约束的大型应用程序。

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

不,我从未听说过这样的节目,甚至没有听过这种节目。

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

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

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

修改

此技术用于获取实时或低延迟行为。 现在,由于更好的GC算法,它可能已经过时了,但这当然取决于具体情况。因此,至少对于算法的热点来说,可能需要考虑这个问题。

举个例子:

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

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

感谢andersoj&迈克拉向我解释这个。

答案 3 :(得分:3)

查看Realtime specification for Java

虽然它有更复杂的规则w.r.t.分配

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

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