Tag: 垃圾收集

垃圾收集器在这里如何避免无限循环?

考虑下面的C#程序,我在codegolf上提交它作为创build一个没有循环的循环的答案: class P{ static int x=0; ~P(){ System.Console.WriteLine(++x); new P(); } static void Main(){ new P(); } } 这个程序在我的检查中看起来像一个无限循环,但似乎运行了几千次迭代,然后程序成功终止,没有错误(没有错误抛出)。 这是一个规范侵犯,最终的P终结者不被称为? 显然这是愚蠢的代码,应该永远不会出现,但我很好奇程序如何完成。 原码高尔夫球杆:: https://codegolf.stackexchange.com/questions/33196/loop-without-looping/33218#33218

创build数百万个小临时对象的最佳实践

什么是创造(和释放)数以百万计的小物体的“最佳实践”? 我正在用Java编写一个国际象棋程序,searchalgorithm为每个可能的移动生成一个“移动”对象,标称search每秒可以轻松生成超过一百万个移动对象。 JVM GC已经能够处理我的开发系统的负载,但我有兴趣探索替代方法,可以: 最大限度地减less垃圾收集的开销 降低低端系统的峰值内存占用。 绝大多数对象都是非常短暂的,但是大约1%的动作被持久化并作为持久值返回,所以任何池化或caching技术都必须提供排除特定对象被重用的能力。 我不希望完整的实例代码,但我会感谢进一步阅读/研究的build议,或开放源代码相似的例子。

Haskell是否需要垃圾回收器?

我很好奇为什么Haskell实现使用GC。 我不能想到一个纯语言中需要GC的情况。 这只是减less复制的优化,还是实际上是必要的? 我正在寻找代码,如果GC不存在将泄漏的示例代码。

减lessHaskell程序中的垃圾收集暂停时间

我们正在开发一个接收和转发“消息”的程序,同时保留这些消息的临时logging,以便它可以在需要时告诉你消息历史。 消息是数字标识的,通常大小在1千字节左右,我们需要保留成千上万条消息。 我们希望优化这个程序的延迟:发送和接收消息之间的时间必须低于10毫秒。 该程序用Haskell编写,并与GHC编译。 但是,我们发现垃圾收集暂停对我们的延迟要求来说太长了:在我们的现实世界程序中超过100毫秒。 以下程序是我们的应用程序的简化版本。 它使用Data.Map.Strict来存储消息。 消息是由Int标识的ByteString 。 按增加的数字顺序插入1000000条消息,并且不断移除最旧的消息以保持历史最多20万条消息。 module Main (main) where import qualified Control.Exception as Exception import qualified Control.Monad as Monad import qualified Data.ByteString as ByteString import qualified Data.Map.Strict as Map data Msg = Msg !Int !ByteString.ByteString type Chan = Map.Map Int ByteString.ByteString message :: Int -> Msg message n = Msg […]

是否有必要显式删除C#中的事件处理程序

我有一个class提供了一些事件。 这个类是全局声明的,但没有在全局声明中实例化 – 它是在需要的方法中根据需要实例化的。 每次在方法中需要该类时,它都是实例化的,并且注册了事件处理程序。 在方法超出范围之前,是否有必要显式移除事件处理程序? 当方法超出范围时,类的实例也是如此。 是否将事件处理程序注册到正在超出范围的实例中是否具有内存占用量的含义? (我想知道如果事件处理程序保持GC看到类实例不再被引用。) 谢谢。

了解.NET中的垃圾收集

考虑下面的代码: public class Class1 { public static int c; ~Class1() { c++; } } public class Class2 { public static void Main() { { var c1=new Class1(); //c1=null; // If this line is not commented out, at the Console.WriteLine call, it prints 1. } GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(Class1.c); // prints 0 Console.Read(); } } 现在,即使main方法中的variablesc1超出了作用域,并且在GC.Collect()时没有被任何其他对象进一步引用,为什么在那里没有最终确定呢?

你如何防止IDisposable传播到所有的类?

从这些简单的课程开始… 比方说,我有一个简单的类,如下所示: class Bus { Driver busDriver = new Driver(); } class Driver { Shoe[] shoes = { new Shoe(), new Shoe() }; } class Shoe { Shoelace lace = new Shoelace(); } class Shoelace { bool tied = false; } 一辆Bus有一个Driver , Driver有两个Shoe ,每个Shoe都有一个Shoelace 。 所有非常愚蠢的。 将一个IDisposable对象添加到鞋带 后来我决定在Shoelace上的一些操作可能是multithreading的,所以我添加一个EventWaitHandle线程来进行通信。 所以Shoelace现在看起来像这样: class Shoelace { private AutoResetEvent […]

JavaScriptclosures如何收集垃圾

我logging了以下Chrome错误 ,导致我的代码中出现了许多严重和不明显的内存泄漏: (这些结果使用Chrome开发工具的内存分析器 ,该分析器运行GC,然后获取所有未收集垃圾的堆快照。) 在下面的代码中, someClass实例是垃圾收集(好): var someClass = function() {}; function f() { var some = new someClass(); return function() {}; } window.f_ = f(); 但在这种情况下不会被垃圾收集(坏): var someClass = function() {}; function f() { var some = new someClass(); function unreachable() { some; } return function() {}; } window.f_ = f(); 和相应的截图: 看来,闭包(在这种情况下, function() […]

什么时候应该使用GC.SuppressFinalize()?

在.NET中,我应该在哪种情况下使用GC.SuppressFinalize() ? 使用这种方法有什么好处给我?

为什么C ++没有垃圾收集器?

首先,我不是在问这个问题,因为垃圾回收的优点。 我问这个问题的主要原因是我知道Bjarne Stroustrup曾经说C ++在某个时间点上会有一个垃圾收集器。 这就是说,为什么没有添加? C ++已经有一些垃圾收集器了。 这只是其中一个“容易说什么”types的东西? 还是还有其他的原因没有被添加(并且不会被添加到C ++ 11中)? 交叉链接: 垃圾收集器的C + + 为了澄清,我明白了C ++在第一次创build时没有垃圾回收器的原因。 我想知道为什么collections家不能被添加进去。