Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
垃圾收集器(.net/java)是实时系统的问题吗?_Java_.net_Garbage Collection_Real Time_Real Time Java - Fatal编程技术网

垃圾收集器(.net/java)是实时系统的问题吗?

垃圾收集器(.net/java)是实时系统的问题吗?,java,.net,garbage-collection,real-time,real-time-java,Java,.net,Garbage Collection,Real Time,Real Time Java,当构建一个需要快速一致响应的系统时,垃圾收集器是一个潜在的问题吗 我记得几年前的恐怖故事,典型的例子总是一个动作游戏,你的角色会在中途停下来几秒钟,这时垃圾收集器会进行清理 我们还有几年,但我想知道这是否仍然是一个问题。我在.NET4中读到了新的垃圾收集器,但它看起来仍然像一个大黑匣子,你只需要相信一切都会好起来 如果你有一个系统总是需要快速反应,垃圾回收器太大了,最好选择一个更硬的内核,像C++一样控制它自己的语言吗?我不喜欢这样的情况,如果它最终成为一个问题,那么除了等待运行时的新版本或者做

当构建一个需要快速一致响应的系统时,垃圾收集器是一个潜在的问题吗

我记得几年前的恐怖故事,典型的例子总是一个动作游戏,你的角色会在中途停下来几秒钟,这时垃圾收集器会进行清理

我们还有几年,但我想知道这是否仍然是一个问题。我在.NET4中读到了新的垃圾收集器,但它看起来仍然像一个大黑匣子,你只需要相信一切都会好起来

<>如果你有一个系统总是需要快速反应,垃圾回收器太大了,最好选择一个更硬的内核,像C++一样控制它自己的语言吗?我不喜欢这样的情况,如果它最终成为一个问题,那么除了等待运行时的新版本或者做一些非常奇怪的事情来尝试影响收集器之外,您基本上什么也做不了

编辑


谢谢你提供的大量资源。然而,似乎大多数文章/定制gc/解决方案都与Java环境有关。Net是否还具有自定义GC的调优功能或选项?

是的,在实时系统中必须以确定性方式处理垃圾

一种方法是在每次内存分配期间安排一定量的垃圾收集时间。这被称为“基于工作的垃圾收集”。其思想是在没有泄漏的情况下,分配和收集应该成比例

另一种简单的方法(“基于时间的垃圾收集”)是安排一定比例的时间进行定期垃圾收集,无论是否需要


在任何一种情况下,程序都可能会耗尽可用内存,因为它不允许花费足够的时间来执行完整的垃圾收集。这与非实时系统不同,非实时系统允许暂停任何时间以收集垃圾。

我用Java和.NET编写过游戏,但从未发现这是一个大问题。我想你的“恐怖故事”是基于多年前的垃圾收集器——从那时起,这项技术真的有了很大的发展

在垃圾收集的基础上,我唯一不愿意使用Java/.NET的东西是类似于具有硬实时约束的嵌入式编程(例如运动控制器)

但是,您确实需要了解GC暂停,并且以下所有内容都有助于将GC暂停的风险降至最低:

  • 最小化新的对象分配-虽然对象分配在现代GC系统中非常快,但它们确实会导致将来的暂停,因此应该最小化。您可以使用诸如预分配对象数组、保留对象池或使用非固定原语等技术
  • 使用专门的低延迟库,例如用于频繁使用的函数和数据类型。这些是专门为实时/低延迟应用程序设计的
  • 当有多个版本可用时,请确保您使用的是最佳GC算法。我听说了一些关于低延迟应用程序的好消息。最好的GC系统同时进行大部分收集,这样垃圾收集就不必“停止世界”很长时间(如果有的话)
  • 适当地调整GC参数。通常,在总体性能和暂停时间之间存在权衡,您可能希望以牺牲前者为代价改进后者

如果你很有钱,你当然可以买带……的机器

准确地说,垃圾收集器是实时系统的一个问题。更准确地说,用具有自动内存管理的语言编写实时软件是可能的

有关使用Java实现实时行为的方法之一的详细信息,请参阅。RTSJ背后的思想非常简单——不要使用堆。RTSJ提供了各种新的可运行对象,以确保线程不会访问任何类型的堆内存。线程可以访问作用域内存(这里没有什么异常;当作用域关闭时,值会被销毁)或永久内存(存在于应用程序的整个生命周期中)。不朽内存中的变量会被一次又一次地写入新值

通过使用不朽内存,RTSJ确保线程不会访问堆,更重要的是,系统没有抢占线程执行程序的垃圾收集器

更多细节可在论文中找到。

这是一个潜在的问题,但

<>你的角色在你的C++程序中间也会冻结,而OS从一个过重的硬盘中检索一页内存。如果您没有在硬件上使用实时操作系统来提供具体的性能保证,则永远无法保证性能


要得到更具体的答案,您必须询问特定虚拟机的特定实现。如果垃圾收集虚拟机提供了有关垃圾收集的适当性能保证,则可以将垃圾收集虚拟机用于实时系统。

从理论角度看,垃圾收集器不是问题,而是解决方案。当存在动态内存分配时,实时系统很难实现。特别是,通常的C函数
malloc()
free()
不提供实时保证(它们通常速度很快,但至少在理论上具有“最坏情况”,即使用过多时间)

碰巧可以构建一个提供实时保证的动态内存分配器,但这需要分配器做一些繁重的工作,特别是移动RAM中的一些对象。对象移动意味着调整指针(从应用程序代码的角度来看,这是透明的),此时分配器只是一个