Tag: garbage collection

使用和垃圾收集

如果我有以下内容,你好只是为了clairfy: using (Object1) { create Object2 } // bookmark1 将Object2与Object1一起销毁到Object2吗? Object2是StringReader,Object1是MemoryStream。

当.NET不在垃圾收集(GC)中时,如何捕获.NET进程的进程内存转储

当捕获转储文件并对其进行分析时(例如在WinDbg中),我经常会收到警告:数据可能不准确,或者命令可能无法访问,因为当收集转储文件时,进程位于GC的中间。 在进行内存分析时,我们经常这样做,因为进程中的内存很高而内存压力很高,我猜这会强制.NET到GC。 如何在GC期间避免转储? 有没有办法知道何时可以安全地捕获转储文件?

在C#中销毁struct对象?

我有点困惑的是,在C#中只有引用类型被垃圾收集。 这意味着GC只选择内存解除分配的引用类型。 那么值类型会发生什么呢?因为它们也会占用堆栈上的内存?

尽管仍然强烈引用,C#WeakReference对象在终结器中为NULL

嗨,我在这里有代码,我不明白为什么我会遇到断点(见评论)。 这是微软的一些我不知道或我不理解的错误吗? 代码在Debug中测试过,但我认为它不会改变任何东西。 注意:您可以直接在控制台应用程序中测试代码。 只是为了信息…在超级猫的回答之后,我用提出的解决方案修复了我的代码并且它工作得很好:-) !!! 糟糕的是静态字典的使用和它的性能,但它的工作原理。 ……几分钟后,我意识到SuperCat给了我更好的提示,解决静态字典并且我做了。 代码示例如下: 代码有bug 代码已更正但具有静态ConditionalWeakTable 包含SuperCat技巧的ConditioalWeakTable代码(非常感谢他!) 样本… using System; using System.Collections.Generic; using System.Diagnostics; namespace WeakrefBug { // ********************************************************************** class B : IDisposable { public static List AllBs = new List(); public B() { AllBs.Add(this); } private bool disposed = false; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual […]

C# – 超出范围时是否会立即销毁对象?

我是否可以相信一个对象被销毁,并且当它超出C#中的范围时会立即调用它的析构函数? 我认为它应该是因为许多常见的编码实践(例如事务对象)都依赖于这种行为,但我并不习惯使用垃圾收集,并且对这些语言通常的行为方式几乎没有任何了解。 谢谢。

在c#中在运行时将expando属性添加到类型化对象

在.net中是否有任何方法可以在运行时将属性字典绑定到实例,即,基本对象类具有如下属性: public IDictionary Items { get; } 我想出了一个涉及静态字典和扩展方法的解决方案 void Main() { var x = new object(); x.Props().y = “hello”; } static class ExpandoExtension { static IDictionary props = new Dictionary(); public static dynamic Props(this object key) { dynamic o; if (!props.TryGetValue(key, out o)){ o = new ExpandoObject(); props[key] = o; } return o; } } […]

使用GC.AddMemoryPressure()防止OutOfMemoryException?

我正在调试一种方法,我们用它来标记具有特定文本的图像,然后再将它们显示在我们的系统中。 标签方法目前看起来像这样: private static Image TagAsProductImage(Image image) { try { // Prepares the garbage collector for added memory pressure (500000 bytes is roughly 485 kilobytes). // Should solve some OutOfMemoryExceptions. GC.AddMemoryPressure(500000); using (Graphics graphics = Graphics.FromImage(image)) { // Create font. Font drawFont = new Font(“Tahoma”, image.Width*IMAGE_TAG_SIZE_FACTOR); // Create brush. SolidBrush drawBrush = new SolidBrush(Color.Black); // […]

垃圾收集和终结器:更好的点

在回答关于SO的另一个问题*以及随后的评论讨论时,我遇到了一个我不清楚的问题。 在我误入歧途的任何地方纠正我…… 当垃圾收集器收集一个对象时,它会在一个单独的线程上调用该对象的终结器(除非终结器已被抑制,例如通过Dispose()方法)。 在收集时,GC会挂起除触发收集的线程(除了背景集合)之外的所有线程。 不清楚的是: 在收集垃圾收集器之前,垃圾收集器是否等待终结器在该对象上执行? 如果没有,它是否在终结器仍在执行时取消挂起线程? 如果它确实等待,如果终结器遇到其中一个被挂起的线程所持有的锁,会发生什么? 终结器线程是否会死锁? (在我的回答中,我认为这是糟糕的设计,但我可能会看到可能发生这种情况的情况) *链接到原始问题: .NET GC从终结器访问同步对象

C#垃圾收集器如何找到唯一引用为内部指针的对象?

在C#中,据我所知, ref和out params只传递相关值的原始地址。 该地址可以是指向数组中的元素或对象内的字段的内部指针。 如果发生垃圾收集,则对某个对象的唯一引用可能是通过其中一个内部指针,如: using System; public class Foo { public int field; public static void Increment(ref int x) { System.GC.Collect(); x = x + 1; Console.WriteLine(x); } public static void Main() { Increment(ref new Foo().field); } } 在这种情况下,GC需要找到对象的开头并将整个对象视为可达。 它是如何做到的? 是否必须扫描整个堆以查找包含该指针的对象? 这似乎很慢。

回调代表被收集?

一直在忙着用FMOD进行C#游戏开发,我早就遇到了麻烦,我似乎无法绕过。 我想做一些分支音频的东西并将一些游戏动作同步到节拍等等,所以我尝试将同步点添加到我的音乐曲目中。 这是代码: public class Music { private Sound music; private Channel channel; private IntPtr syncPtr; public string File { get; private set; } public Music(string file) { File = file; } public void Load() { music = new Sound(); Audio.System.createSound(File, MODE.HARDWARE, ref music); } public void Unload() { music.release(); } public virtual void Play() […]