〜1s延迟控制应用程序:这适用于Java吗?

时间:2010-05-26 20:31:56

标签: java c++ controls garbage-collection raii

在我的工作中,我们最近完成了控制应用程序的系统架构,其最大延迟大约为一到两秒。它分布在通过IP LAN进行通信的小型ARM片上盒中。

我们最初预见到我们会使用C或C ++,因为它是一种经典的控制系统语言。在讨论了如何实现应用程序之后,我们现在意识到C ++具有相当有限的库,缺乏内省,并且具有一些可能减慢开发的其他属性。我的同事然后建议Java可能会胜任这项工作。

我真的害怕为控制应用程序运行GC的延迟,我也不愿意丢弃RAII,因为该应用程序将使用大量外部资源(套接字,文件句柄,外部库的句柄)等)。

赞成/反对意见清单目前如下:

C++

+ RAII - Easy resource management - it will be a complex system
+ System language - speed if we cant't find a JIT VM for our ARM
+ No GC - no big worst case latencies from the GC
+ Easy to integrate with some shared mem libs that we have to interface with
- Fewer free as in beer libs 
- Lacks introspection - Mapping classes to DB and external data formats (XML)    
  would benefit from this (ORM /JAXB) approach
- Easy to shoot one self in the foot - hard and expensive to find programmers 
  which don't make big mistakes
- Memory fragmentation - needs tuning and workarounds

Java

+ Huge amount of libs
+ Introspection - serialization becomes a breeze (see C++ section)
+ Easier to find 'good enough' programmers
- No RAII - Client has to remember finally or you leak 
   resources. IMO Java programmers tend to ignore this 
   problem unless they have server app background.
- No System Language - possibly slower although ARMj could alleviate this
- GC - latency might go up (don't know if parallel GC will work - seems that
     you might get fragmentation, see note below).
- Need to write JNI for the shared mem libs that we interface with
- Maybe ORACLE will eat us

提到并行GC的内存碎片in this AMD article

如果GC延迟不成问题,我很乐意使用Java,我们可以获得RAII。因此 我也研究了其他有RAII并且可以作为替代品的langs,到目前为止我发现D,Ada,VB,Perl,Python(C),PHP,tcl和Lua似乎有某种超出范围的回调。我的自然反应可能是D,Python和ADA可能适合控制应用程序。 D和ADA是我的最爱。

所以,我的问题是:你有什么建议吗? Java是一个可行的选择,如果你可以选择任何语言,它会是什么?

3 个答案:

答案 0 :(得分:2)

如果您希望使用java,可能需要证明概念,我建议您编写一个简单的prototye和压力测试,以检查垃圾收集期间在高负载下的延迟时间。然后检查不同的收集器类型。 low pause collector

我不太了解的RAII参数,在c ++中,恕我直言创建内存泄漏比在java中更容易。

答案 1 :(得分:1)

GC仅用于从废弃对象中回收内存。丢弃很少的资源,你会得到很少,更短的GC。

您可能会使用大量套接字,文件句柄,外部库中的句柄,但是您丢弃它们的速度有多快?

完整的GC旨在消除碎片。它通过复制所有内存来连续使用它。这就是它昂贵的原因,因此如果延迟对您很重要,您希望将这些最小化。也就是说,如果您的完整GC占用时间超过100毫秒,则会出现严重的性能问题。它不应该那么高。

恕我直言,简而言之,你应该能够开发一个延迟远低于10毫秒,99%以上时间的控制系统。

答案 2 :(得分:1)

在这样的环境中,我会远离GC(当然在我见过的任何JVM中实现)。你将永远在这个问题上撞到墙上。

但是,我只想指出RAII的论点看起来很弱 - 您需要进行代码审查和其他此类培训,以确保您的团队能够很好地理解这些问题。排除一种其他适当的语言是一个非常糟糕的理由,因为每种语言都有一种缺乏经验/不那么出色的程序员可能会错过的语言。

我从你的清单中感觉到你错过了C#(我正在考虑使用Mono),你需要它时可以有更多的控制权。我不知道它是否适合您的环境,但如果您在自己的语言列表中列出VB,则显然是一种疏忽。