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

Java 为嵌入式流媒体设备选择JVM,java,raspberry-pi,garbage-collection,jvm,streaming,Java,Raspberry Pi,Garbage Collection,Jvm,Streaming,我们正在开发一种基本上是raspberry pi的设备,它可以读取文件数据,对其进行处理,并以给定的帧速率从USB设备中输出数据 由于我们正在使用的特性的性质,我们不能完全消除垃圾分配,我们的GC暂停甚至很小,年轻一代GC都会导致帧跳过 现在我们使用的是HotSpot JVM,但我的理解是,它更适合大堆大小,我们的内存需求很少超过256mb,所以我想知道是否有更好的带有垃圾收集的VM可以让我们在Raspberry Pi上的暂停时间小于15ms?我想你会很难解决这个问题。您没有提供用于启动JVM的

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

由于我们正在使用的特性的性质,我们不能完全消除垃圾分配,我们的GC暂停甚至很小,年轻一代GC都会导致帧跳过


现在我们使用的是HotSpot JVM,但我的理解是,它更适合大堆大小,我们的内存需求很少超过256mb,所以我想知道是否有更好的带有垃圾收集的VM可以让我们在Raspberry Pi上的暂停时间小于15ms?

我想你会很难解决这个问题。您没有提供用于启动JVM的标志,因此无法推荐替代方案

配置良好的G1收集器,其应用程序不会生成不断增加的长寿命对象,这将避免停止全球完整的地面军事系统。然而,您的问题是,即使是通常速度非常快的小型地面军事系统也会造成不可接受的延迟。问题的一部分是Pi上内存总线的速度,这并不是很好


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

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

配置良好的G1收集器,其应用程序不会生成不断增加的长寿命对象,这将避免停止全球完整的地面军事系统。然而,您的问题是,即使是通常速度非常快的小型地面军事系统也会造成不可接受的延迟。问题的一部分是Pi上内存总线的速度,这并不是很好


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

最终,我们决定让应用程序做一些它真正不是为之而构建的事情,或者至少不值得继续沿着这条道路开发资源

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


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

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

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


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

啊,我们正在考虑Azul作为解决方案,但许可成本过高,我不知道它还需要大量RAM。仅供参考,我们确实将我们的虚拟机切换到了zulu embedded,并且我们注意到了性能的提升,所以至少有一点:。感谢对G1收集器的了解,当我们分析它时,我们正在阻止世界事件,但我们也在后台创建了大量垃圾,这是有道理的。啊,我们正在考虑Azul作为解决方案,但许可成本过高,我不知道它还需要大量RAM。仅供参考,我们确实将我们的虚拟机切换到了zulu embedded,并且我们注意到了性能的提升,所以至少有一点:。感谢对G1收集器的深入了解,当我们分析它时,我们正在停止世界事件,但是我们也在后台创建了大量垃圾,所以这是有道理的。您可能想尝试一下Red Hat的Shenandoah。Aleksey Shipilëv本周在JavaZone上谈到了这一点,并表示它将在Pi 3上运行,并显著减少暂停。因为它是单代收集器,所以对您的应用程序来说可能更好。您可能想尝试一下Red Hat的Shenandoah。Aleksey Shipilëv本周在JavaZone上谈到了这一点,并表示它将在Pi 3上运行,并显著减少暂停。由于它是一个单代收集器,因此可能更适合您的应用程序。