为什么在大多数实时应用程序中首选c而不是java

时间:2010-01-02 18:10:56

标签: java c

在大多数实时应用程序中,为什么C首选而不是Java?例如,航线系统。我想要一些原因,除了Java有点慢。

7 个答案:

答案 0 :(得分:9)

有很多原因:

  1. 历史 - 航空公司系统比Java早。它可能需要重写,但我知道它今天没有进展。
  2. 实时通常避免垃圾收集,因为你不能让系统在GC线程完成其工作的微妙时刻等待。事物必须在实时控制情况下更具确定性。对于Java,C#和使用GC的任何其他语言都是如此。
  3. 有一个real time version of Java,但我不知道它的使用范围有多广。

    我不确定C / C ++总是比Java更快的结论对于JDK 6来说仍然是正确的。自从1.0版本执行了许多基准测试以来,已经发生了很多变化(例如,更快的对象创建,新记忆模型,新一代GC算法,修订反射等)。

答案 1 :(得分:7)

这不是慢慢的问题。这是关于决定论和安全。 Java通常很快,当垃圾收集器决定运行并暂停执行一秒钟时,它可以挂起一微秒。如果垃圾收集器在以150英里/小时的速度下降之前扩展飞机装备时会运行,那么可能会发生不好的事情。

具有显式内存分配的C具有更高的确定性,程序员可以完全控制何时释放/分配多少内存,并且可以在执行安全关键操作时决定不释放内存。

目前,新的关键系统甚至不用C语言编写,而是用更安全的语言编写,如ADA。这与C一样具有确定性,并且(从类型安全的角度来看)甚至比Java更安全。

答案 2 :(得分:3)

最大的原因之一是C没有垃圾收集。垃圾收集非常好,因为您不必担心释放内存并且内存泄漏不是问题,但垃圾收集可能需要100毫秒或更长时间。在许多应用程序中,这一次是微不足道的,但这意味着您的应用程序在100毫秒内无法执行任何其他操作。在某些实时应用中,这是不可接受的。欲了解更多信息,请阅读:

http://java.sun.com/javase/technologies/realtime/faq.jsp#2

答案 3 :(得分:1)

“实时”有许多不同的风格。

对于“半硬实时”,可以使用C为RTLinux编写内核模块:

http://en.wikipedia.org/wiki/RTLinux

<强> 编辑: 您根本无法使用Java执行此操作(编写内核模块)。此外,内核模块是超级偏执的 - 您无法在实时空间中与硬盘进行通信。

答案 4 :(得分:1)

对于实时系统来说,实际上并没有太多停止使用java。有两种不同的方法。

  1. 来自Sun的RT Java(JSR-1),它基本上为您提供了一组新的API,用于与RTOS交互并自行进行内存管理。
  2. 接近实时JVM,如JRockit Realtime,带有实时GC,这样可以解决gc不可预测的特性,一次暂停1ms,下次暂停10ms。
  3. 与许多人的想法相反,速度实际上不是实时的。您需要一个足够可预测的系统,以确切地知道事情何时发生(尽可能)并且能够相信您的过程每次运行时都需要相同的时间来完成。使用普通java提供的工具集停止这一点的一件事是内置的集合集。 Javolution是解决这个问题的一种方法(据我所知,它有效地用于航空公司系统(在地面上))。

    然而,在一天结束时,没有适合每个人的工具。出于很多原因,我不会将java用于嵌入式自动驾驶仪的实际逻辑,但我不认为实时方面是这种感觉的主要原因。

答案 5 :(得分:0)

C更接近机器的硬件。 Java在JVM上运行。 此外,C在On-the-Fly模式下编译,而java文件首先编译为字节码文件(.class),然后由JVM执行。

- 在我看来,编码和性能的复杂性是两种语言的权衡。

答案 6 :(得分:-3)

航空公司系统是用Cobol编写的,而不是C语言。