Tag: garbage collection

压缩发生后GC如何更新引用

.NET垃圾收集器收集对象(回收它们的内存)并执行内存压缩(以将内存碎片保持在最低限度)。 我想知道,因为一个应用程序可能有很多对象的引用,当对象的地址由于GC的压缩而改变时,GC(或CLR)如何管理这些对象的引用。

String和Char类型如何在.NET中存储在内存中?

我需要存储一个语言代码字符串,例如“en”,它总是包含2个字符。 将类型定义为“String”或“Char”更好吗? private string languageCode; VS private char[] languageCode; 或者还有另一种更好的选择吗? 这些2如何存储在内存中? 分配值时,将为它们分配多少字节或位?

C#显式删除事件处理程序

我想知道将对象设置为null是否会清除附加到对象事件的任何事件处理程序… 例如 Button button = new Button(); button.Click += new EventHandler(Button_Click); button = null; button = new Button(); button.Click += new EventHandler(Button_Click); button = null; 等等… 这会导致内存泄漏吗?

使用Object Initializer的复活差异

我有这个代码: 本质上我正在尝试演示使用c#终结器并制作一个不能死的对象,我称之为Zombie。 现在,通常这个演示工作得很好,但今天我尝试使用与对象初始化程序相同的代码,而不是仅仅分配给属性(在本例中为Name)。 我注意到有区别。 即使终结器永远不会被调用,即使我正在尽最大努力使垃圾收集器完成它的工作。 有人可以解释这个区别,还是我在C#编译器中发现了一个错误? (我在Win7x64的VS2010 SP1中使用C#4) 谢谢。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace Zombie { class Program { static void Main(string[] args) { Console.WriteLine(“Main thread: ” + Thread.CurrentThread.ManagedThreadId); // case 1: this is where the problem is located. Zombie z = new Zombie { Name = “Guy” }; […]

有没有办法检索C#app的当前内存使用情况?

我正在自动执行一些分析任务,并希望实时记录堆空间和生成大小。 对于我需要的内容, 分析API似乎非常复杂,它似乎在监听单个分配和集合,这对我来说并不重要。 分析工具当然是一个很好的帮助,但我一直在寻找一个更灵活,可编程的界面。

终结者和IDisposable

根据文档(MSDN: 链接 ),很明显在实现终结器时应该使用IDisposable模式。 但是,如果实现IDisposable(以便提供处理对象的确定性方法),您是否需要实现终结器?并且您没有任何非托管资源来清理? 在我看来,如果类只有托管资源,如果你不调用Dispose,那么托管资源将自动被GC清理,因此不需要实现终结器。 我错了吗? 另外,如果我使用我的Dispose方法清理事件处理程序,该怎么办? 由于Dispose不会自动被GC调用,我应该实现Finalizer,以确保事件处理程序无线连接吗?

字符串和垃圾收集

我听过有关这个主题的相互矛盾的故事,我正在寻找一点清晰。 如何立即处理一个string对象,或者至少清除它的痕迹?

GC.Collect()不立即收集?

在聊天的讨论过程中,我编写了这个控制台应用程序。 码: using System; class Program { static void Main(string[] args) { CreateClass(); Console.Write(“Collecting… “); GC.Collect(); Console.WriteLine(“Done”); } static void CreateClass() { SomeClass c = new SomeClass(); } } class SomeClass { ~SomeClass() { throw new Exception(); } } 结果: Collecting… Done Unhandled Exception: System.Exception: Exception of type ‘System.Exception’ was thrown. at SomeClass.Finalize() 在 Done打印之前,我原本预计应用程序会崩溃。 […]

强制数组的垃圾收集,C#

我有一个问题,其中一对三维数组分配了大量的内存,程序有时需要用更大/更小的内容替换它们并抛出OutOfMemoryException。 示例:有5个分配的96MBarrays(200x200x200,每个条目中有12个字节的数据),程序需要用210x210x210(111MB)替换它们。 它以类似于这样的方式实现: array1 = new Vector3[210,210,210]; 其中array1-array5与先前使用的字段相同。 这应该将旧数组设置为垃圾收集的候选者,但看起来GC不能足够快地运行并在分配新数组之前分配旧数组 – 这会导致OOM – 而如果它们在新分配之前释放,则空间应该是足够。 我正在寻找的是一种做这样的事情的方法: GC.Collect(array1) // this would set the reference to null and free the memory array1 = new Vector3[210,210,210]; 我不确定完整的垃圾收集是否是一个好主意,因为该代码可能(在某些情况下)需要经常执行。 有没有正确的方法呢?

异步/等待,自定义awaiter和垃圾收集器

我正在处理托管对象在async方法中过早完成的情况。 这是一个业余爱好的家庭自动化项目(Windows 8.1,.NET 4.5.1),我向非托管第三方DLL提供C#回调。 在某个传感器事件时调用回调。 要处理事件,我使用async/await和一个简单的自定义awaiter(而不是TaskCompletionSource )。 我这样做的部分原因是为了减少不必要的分配数量,但主要是出于好奇心作为学习练习。 下面是我所拥有的非常剥离的版本,使用Win32计时器队列计时器来模拟非托管事件源。 让我们从输出开始: 按Enter退出… 服务员() 打勾:0 打勾:1 〜Awaiter() 打勾:2 打勾:3 打勾:4 请注意我的等待者在第二次打勾后如何最终确定。 这是出乎意料的。 代码(控制台应用程序): using System; using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication { class Program { static async Task TestAsync() { var awaiter = new Awaiter(); //var hold = GCHandle.Alloc(awaiter); WaitOrTimerCallbackProc callback = (a, b) => […]