除了垃圾收集器,还有什么使Java成为非实时编程语言


28

除了垃圾收集器,Java中还有哪些其他功能使其不适合实时编程?在网上,无论何时就实时编程讨论Java与C ++,总是提到垃圾收集器。还有别的事吗?


4
即使是垃圾收集也不是问题-有多个可用的硬实时垃圾收集器。那些将gc称为实时显示停止器的人根本无能为力。
SK-logic

2
@ SK-logic s / incompetent / uninformed / g
Scott Whitlock,

@ScottWhitlock,同意,大多数都是。但是有些人(最直言不讳的人)即使在被正确告知后仍然坚持。我不知道对此人类学现象有任何合理的解释。
SK-logic

Answers:


36

我还可以记住另外两个项目:

  1. JIT编译
  2. 线程实现

就实时而言,性能的可预测性可能是最重要的因素。这就是为什么不可预测的GC周期使Java不适合实时的原因。

JIT提供了改进的性能,但是在程序运行后的某个时候启动,占用了一些资源,并更改了系统的执行速度。如果VM认为当时可以做得更好,那么以后也可能再次发生。

关于线程:在这一点上,我还不太记得这是语言设计的一部分,还是只是一个非常普通的实现,但是Java通常不提供精确控制线程执行的工具;例如,虽然为线程指定了10个“优先级”,但是并不需要VM真正考虑这些优先级。系统也未定义停止或切换线程的操作员,或者未严格遵守这些操作员。

JSR 1:有几种Java实时规范的实现,该规范已于1998年获得批准。该规范尽可能解决了使标准Java不适合实时的问题。

大约5年前,Sun(现在为Oracle)拥有RTSJ VM(从未命名为AFAIK)。IBM使用WebSphere Real Time;JamaicaVM是一个免费的(?),独立于平台的解决方案。谷歌搜索那些今天不会带来太多。


尽管比较少,但另一个问题是,仅在使用类时才加载类。
T-Bull

5
Java规范中没有什么可以强制执行JIT而不是AOT或纯粹的解释。纯绿色线程是完全可预测的,因此它们也不是实时障碍。
SK-logic

Websphere实时至少似乎仍受支持(声称Java 7.0支持,您可以进入页面进行购买)
jk。

@ SK-logic-对,好点!
阿维夫

33

作业系统

只要Java在Unix或Windows或任何其他“常规”操作系统上运行,就不能保证实时性。

要运行实时应用程序,必须使用实时操作系统。


13
@ Giorgio:硬实时保证?是。
Joachim Sauer 2013年

5
此外,还有从一开始就为实时而设计的可用操作系统,例如FreeRTOS。
medivh

4
尽管这通常对于硬实时而言是非常重要的一点,但丝毫没有Java特有的意义。我想念什么吗?

3
@delnan的重点是,即使您使用Java虚拟机的(虚构的?)实时实现,如果OS无法为您提供实时保证,也无济于事。
schlingel

3
@delnan-这个问题有错误的前缀,表明C ++是一种实时编程语言。
mouviciel 2013年

7

从技术上讲,可以使用实时Java(如SK-logic的评论所建议)。但是由于多种非技术原因,这种情况并不常见:

旧标准

很难找到对此的参考,但是我确定我已经看过安全标准或安全标准符合性建议,因此全面禁止Java。是对是非,如果您必须遵循说Java是verboten的东西,那么Java是Verboten。

老安全工程师

即使您需要制定禁止禁止Java的标准,但与没有Java经验的安全/质量审核员一起工作也将非常意味着您没有遵循阻力最小的道路。对于审计师而言,任何与众不同的事情都可能会引起很多问题,这反过来又意味着您需要进行大量工作来证明自己的选择。

社区

即存在很多路径依赖关系,当前大多数实时专家都会完全了解C ++,C或ADA,因此自然而然地从事新工作。

(注意:我在上面将实时性和安全性混为一谈,这是另一个问题,即使安全标准也经常将两者混为一谈)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.