为嵌入式流媒体设备选择 JVM

Selecting a JVM for an embedded streaming device

我们正在开发一种基本上是 raspberry pi 的设备,它可以读取文件数据、处理文件数据并以给定的帧速率将数据从 USB 设备中流出。

由于我们使用的特性的性质,我们无法完全消除垃圾分配,而且我们的 GC 暂停甚至是次要的年轻代 GC 会导致跳帧。

现在我们正在使用 HotSpot JVM,但我的理解是它更适合大堆大小,我们的内存需求很少超过 256mb,所以我想知道是否有更好的具有垃圾收集功能的 VM 可以在 Raspberry Pi?

上让我们暂停少于 15 毫秒

我想你会为此苦苦挣扎。您没有提供用于启动 JVM 的标志,因此无法推荐替代方案。

一个配置良好的 G1 收集器,其应用程序不会生成不断增加的长生命周期对象,这将避免停止世界的完整 GC。但是,您的问题是,即使是较小的 GC(通常非常快)也会导致不可接受的延迟。部分问题是 Pi 上的内存总线速度,它并不是那么好。

我们(Azul,我为之工作)生产无暂停收集器 (C4),但它是为具有更多资源的机器设计的。它至少需要 1Gb RAM,并使用多个内核与应用程序线程同时处理 GC。

最终,我们决定努力让应用程序做一些它真正不适合做的事情,或者至少,不值得继续沿着这条路开发资源。

我们当前的解决方案是让应用程序保持原样,接受垃圾收集暂停的现实,这样我们就不会因大量优化而阻碍我们应用程序的未来开发。让 Java 做它设计的事情。

为了停止导致跳帧的暂停,我们选择创建第二个微型缓冲区应用程序,由我们的主应用程序通过 IPC 管理。