我经常听到开发人员提的是Java的不能“ 做实时 ”,这意味着在Linux上运行的Java应用程序不能满足一个确定性的实时系统的要求,如对RIOT-OS等运行的东西
我试图理解为什么。我的SWAG告诉我,这可能主要是由于Java的Garbage Collector可以在任何时间运行并完全暂停系统。而且,尽管那里有所谓的“无暂停GC”,但我不一定相信他们的广告,也没有每个JVM实例$ 80K的兴趣来支持这个业余项目!
我还阅读了有关在Linux上运行无人机软件的文章。在那篇文章中,作者描述了Linux几乎导致无人机撞车的情况:
在选择在Pi上执行低级控制循环(PID)之后,我学到了很难的一课-为了变得聪明,我决定在循环的中间放置一个日志记录以进行调试-Quad最初运行良好,但随后Linux决定花2秒写一个日志条目,然后四边形几乎撞到了我的车上!
现在,尽管那个作者用C ++编写了无人机软件,但我可以想象,在Linux上运行的Java应用程序可能遭受同样的命运。
根据维基百科:
如果一个操作的总正确性不仅取决于它的逻辑正确性,还取决于它执行的时间,那么该系统就是实时的。
所以对我来说,这意味着“ 如果完全正确需要逻辑上的正确性和及时性,那么您就不会实时。 ”
假设我已经编写了一个Java应用程序以使其具有超强的性能,可以这么说,我已经“挤满了柠檬”,并且不能合理地用Java编写该程序以使其更快。
总而言之,我的问题是:我正在寻找可以向我解释所有/大多数运行Linux的Java应用程序无法成为“实时应用程序”的原因。意思是,什么使Java / Linux堆栈上的所有事物类别阻止了它“及时”,从而使其“ 完全正确 ”?如前所述,GC和Linux日志刷新似乎可以暂停执行,但是我敢肯定Java应用程序本身之外还有更多事情会导致计时/性能下降,并使其难以满足最终期限的要求。这些是什么?