C# 在哪种情况下,将语言与GC结合使用可以实现音频播放而不丢失?

C# 在哪种情况下,将语言与GC结合使用可以实现音频播放而不丢失?,c#,java,audio,garbage-collection,managed,C#,Java,Audio,Garbage Collection,Managed,据我所知,使用带有垃圾收集的语言意味着会有时间间隔,在这个时间间隔内,整个应用程序都会停止。但我很好奇这个站点的范围 例如,Java有PortAudio绑定,有两种操作模式,它们在控制方向上有所不同。在一种模式下,您调用PortAudio来放置一些它必须播放的数据,在另一种模式下,PortAudio调用您(回调函数)来用数据填充其缓冲区。我想知道,为什么PortAudio的Java绑定不允许第二种模式(使用回调)。解释如下:此Java绑定不支持音频回调,因为音频回调永远不会阻塞。调用Java虚拟

据我所知,使用带有垃圾收集的语言意味着会有时间间隔,在这个时间间隔内,整个应用程序都会停止。但我很好奇这个站点的范围

例如,Java有
PortAudio
绑定,有两种操作模式,它们在控制方向上有所不同。在一种模式下,您调用PortAudio来放置一些它必须播放的数据,在另一种模式下,PortAudio调用您(回调函数)来用数据填充其缓冲区。我想知道,为什么PortAudio的Java绑定不允许第二种模式(使用回调)。解释如下:
此Java绑定不支持音频回调,因为音频回调永远不会阻塞。调用Java虚拟机可能会阻止垃圾收集或同步。因此,只支持阻塞读/写模式。
这意味着在其他情况下,GC不应该是一个问题?但是为什么呢?我不明白

在使用GC的其他编程语言中,情况会有什么不同?(特别有趣的是C#和D)如果我想用GC语言实现一个音频播放器(永远不会丢失示例),而只使用一个进程,我应该注意什么?有可能吗

之前,我曾参与用Java开发一种VoIP软件,其中辍学者的问题非常严重,与GCs相关。但我认为做音乐播放器应该更容易,因为延迟在这里不是问题,我可以使用巨大的音频数据缓冲区

更新:
我只对免费和开源的解决方案感兴趣。因此,例如,使用Java运行时的“替代”但非免费实现不是我可以使用的选项。但无论如何,知道这一点很有意思。

注意,任何答案都必然取决于所讨论的GC的细节(在JVM之间甚至在单个JVM中可能会有很大的差异)。一些地面军事系统保证最大的暂停时间,另一些则根本不暂停(除了非常短暂,很少复制堆栈,几乎不值得一提),而其他地面军事系统则不提供任何保证。有些可以通过不分配任何内存来阻止运行,有些则可以在从未分配任何内存的情况下继续运行。@delnan在HotSpot上,all GC的pause and none提供了保证的最大暂停时间。有些人尽最大努力限制停顿。据我所知,在没有分配的情况下不会运行任何程序。“据我所知,使用带有垃圾收集的语言意味着会有时间间隔,在这个时间间隔内,整个应用程序都会停止。”这种假设是错误的。您正在考虑一种特定类型的垃圾收集器,即“停止世界”垃圾收集器。并发垃圾收集器在理论上根本不会停止程序。正如德尔南所指出的,地面军事系统是实时或接近实时的@MarkoTopolnik这取决于JVM。有些JVM确实对GC周期的长度有实时限制。@MarkoTopolnik是的,HotSpot是这样的-没有办法完全消除暂停,甚至限制最大暂停时间也不能完美地工作(尽管如果应用程序除了普通GUI之外不做任何与音频/视频I/O相关的事情,这可能就足够了)。在那里也很难不分配,因为JVM在设计上没有用户定义的值类型,但情况不同。我假设至少在用户与GUI交互时会有分配。如果这会导致辍学,那么这是不可能的…@johngood point。但实际上我还没见过他们。如果你给出一些(不仅仅是理论上的)无停顿地面军事系统的例子,这将是很酷的。