Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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垃圾收集器的效率_.net_Garbage Collection - Fatal编程技术网

.NET垃圾收集器的效率

.NET垃圾收集器的效率,.net,garbage-collection,.net,Garbage Collection,好吧,就这么定了。 有些人把自己的生命交给了.NET的垃圾收集器,有些人根本不相信它 我是部分信任它的人之一,只要它不是非常关键的性能(我知道我知道..关键性能+.net不是最受欢迎的组合),在这种情况下,我更喜欢手动处置我的对象和资源 我想问的是,是否有任何事实表明垃圾收集器的性能究竟有多高 请不要分享任何个人观点或基于经验的可能假设,我想要公正的事实。我也不想进行任何赞成/反对的讨论,因为这不会回答问题 谢谢 编辑:为了澄清这一点,我基本上是说:无论我们编写什么应用程序,资源关键型还是非关键

好吧,就这么定了。 有些人把自己的生命交给了.NET的垃圾收集器,有些人根本不相信它

我是部分信任它的人之一,只要它不是非常关键的性能(我知道我知道..关键性能+.net不是最受欢迎的组合),在这种情况下,我更喜欢手动处置我的对象和资源

我想问的是,是否有任何事实表明垃圾收集器的性能究竟有多高

请不要分享任何个人观点或基于经验的可能假设,我想要公正的事实。我也不想进行任何赞成/反对的讨论,因为这不会回答问题

谢谢

编辑:为了澄清这一点,我基本上是说:无论我们编写什么应用程序,资源关键型还是非关键型,我们都可以忘记一切,让GC来处理,还是不行

我试图得到一个答案,在现实中GC做什么和不做什么,它可能会失败,如果有这样的情况,手动内存管理会成功。它有限制吗?我不知道怎样才能进一步解释我的问题


我对任何应用程序都没有任何问题,这是一个理论问题。

对于大多数应用程序来说都足够有效。但是你不必生活在对GC的恐惧中。在非常热的系统上,低延迟要求,您应该以完全避免这种情况的方式进行编程。我建议你看看这个:

虽然GC的执行非常简单 很快,执行起来确实需要时间, 因此,在您的系统中进行垃圾收集 连续运行模式可以 引入不期望的延迟和延迟 这些患者的潜伏期变化 高可用性的应用程序 对延迟敏感。作为 插图,如果您正在处理 每秒100000条消息,每个 消息使用了一个小的临时2 字符串,大约8字节(此 字符串编码的函数和 字符串(对象)的实现 为每封邮件分配一个。因此 您正在创建将近1MB的垃圾 每秒。对于一个可能 需要提供持续的性能 在16小时内,这意味着 你必须在16小时内打扫卫生 60分钟x 60秒x 1MB容量 内存大约为56 GB。 你能从中得到的最好的结果 垃圾收集器就是这样 用两种方法彻底清理这个 第0代或第1代集合和 导致抖动,最糟糕的是它 将导致第2代垃圾 具有关联的较大 潜伏期峰值


但是要注意,避免GC影响这样的技巧是非常困难的。你真的需要考虑你是否在你的PARF需求中需要考虑GC的影响。

< P>任何GC算法都会支持某些活动(即:优化)。您必须根据您的使用模式测试GC,以查看它对您的效率。即使其他人研究了.NETGC的特定行为并产生了“事实”和“数字”,您的结果也可能会大相径庭


我认为这个问题唯一合理的答案是轶事。大多数人在GC效率方面没有问题,即使在大规模情况下也是如此。它被认为至少与其他托管语言的GC一样高效或更高效。如果您仍然担心,您可能不应该使用托管语言。

您不必担心这一点

原因是,如果您发现GC占用大量时间的边缘情况,您将能够通过进行现场优化来处理它。这不会是世界末日——这可能相当容易

你不太可能找到这样的边缘案例。它真的表现得出奇地好。如果您只在典型的C和C++实现中体验堆分配器,那么.NET GC是完全不同的动物。我对此感到非常惊讶。

无论您是否使用GC,您都不能总是忘记内存分配。一个好的GC实现给您带来的好处是,在大多数情况下,您可以不考虑内存分配。但是,没有最终的内存分配器。对于一些关键的事情,你必须知道内存是如何管理的,这意味着知道事情是如何在内部完成的。对于GC和手动堆分配都是如此

有一些GC提供实时保证。“实时”并不意味着“快”,它意味着分配器的响应时间是有界的。这是嵌入式系统所需要的保证,比如那些在飞机上驱动电子命令的系统。奇怪的是,垃圾收集器比手动分配器更容易获得实时保证


当前.NET实现中的GC不是实时的;它们具有启发性的高效性和快速性。请注意,对于C中的
malloc()
(或C++中的
new
)手动分配也可以这样说,因此,如果您需要实时保证,那么您已经需要使用一些特殊的东西了。如果你没有,那么我不希望你为我使用的汽车和飞机设计嵌入式电子设备

我可以告诉你一些关于.NET垃圾收集器的问题

如果您正在运行一个使用服务器GC的应用程序(例如ASP.NET应用程序),那么您的延迟将非常糟糕,当您的任何线程都无法取得任何进展时,会暂停大约一秒钟。这是因为.NET4服务器GC是停止世界GC。显然,.NET4.5将引入微软的第一个主要是并发服务器GC

我曾经编写过一些检测代码,使用内置集合(如
ConcurrentBag
)来测量并发系统中的延迟,由于大量堆碎片,32位内存一直不足,因为.NET GC不会对larg进行碎片整理