草庐IT

unity-内存GC

全部标签

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

.NET垃圾收集器收集对象(回收它们的内存)并执行内存压缩(以将内存碎片保持在最低限度)。我想知道,由于一个应用程序可能有很多对对象的引用,当对象的地址由于GC进行的压缩而发生变化时,GC(或CLR)如何管理这些对对象的引用。 最佳答案 这个概念很简单,垃圾收集器简单地更新任何对象引用并将它们重新指向移动的对象。实现有点棘手,native代码和托管代码之间没有真正的区别,它们都是机器代码。对象引用并没有什么特别之处,它只是运行时的一个指针。收集器需要一种可靠的方法来找回这些指针并将它们识别为引用托管对象的类型。不仅要在压缩过程中移动

c# - 将 GC.AddMemoryPressure 与非托管资源一起使用有什么意义?

我在MSDN和CLRviac#上读到了这个问题。假设我们有一个分配的2Mb非托管HBITMAP和一个指向它的8字节托管位图。如果它永远无法对对象做任何事情,那么用AddMemoryPressure告诉GC有什么意义,因为它被分配为非托管资源,因此不易受到垃圾收集的影响? 最佳答案 提供它是为了让GC在收集期间了解对象的真实成本。如果对象实际上大于管理大小反射(reflect)的大小,则它可能是快速(更)收集的候选对象。布拉德·艾布拉姆斯entry关于它很清楚:Consideraclassthathasaverysmallmanage

c# - 如何在 C# 中执行线程安全函数内存?

此处堆栈溢出found内存单参数函数的代码:staticFuncMemoize(thisFuncf){vard=newDictionary();returna=>{Rr;if(!d.TryGetValue(a,outr)){r=f(a);d.Add(a,r);}returnr;};}虽然这段代码为我完成了它的工作,但当同时从多个线程调用内存函数时,它有时会失败:Add方法使用相同的参数被调用两次并抛出异常。如何使内存线程安全? 最佳答案 您可以使用ConcurrentDictionary.GetOrAdd它做你需要的一切:stati

c# - GC.Collect() 阻塞了吗?

我正在对我的代码运行一些基准测试,我想确保在我的一个基准测试期间不会发生垃圾收集,因为它正在清理先前测试的困惑情况。我认为我最好的机会是在开始基准测试之前强制收集。所以我在基准测试开始之前调用GC.Collect()但不确定收集是否继续在单独的线程中运行,等等并立即返回。如果它确实在BG线程上运行,我想知道如何同步调用它或至少等到它完成收集。 最佳答案 如MSDN所述-使用此方法尝试回收所有不可访问的内存。无论如何,如果它确实开始了垃圾收集,您应该在开始基准测试之前等待所有终结器完成。GC.Collect();GC.WaitForP

c# - Unity中有TryResolve吗?

如何让Unity不抛出ResolutionFailedException如果Resolve失败了?有没有类似TryResolve的东西?varcontainer=newUnityContainer();varfoo=container.TryResolve();Assert.IsNull(foo); 最佳答案 另请注意,如果您使用的是Unity2.0你可以使用新的IsRegistered()方法,它是genericversion 关于c#-Unity中有TryResolve吗?,我们在S

c# - 读取内存中的 Excel 电子表格

如何读取刚刚发布到我的服务器的Excel电子表格?我搜索了一些东西,但我只找到了如何读取带有文件名路径的Excel电子表格,这不是我的情况。我需要这样的东西:publicActionResultImport(HttpPostedFileBasefile){varexcel=newExcelQueryFactory(file);//usinglinqtoexcel} 最佳答案 我遇到了同样的问题,但我不想切换到付费服务,所以这就是我所做的。publicclassDataImportHelper:IDisposable{privater

c# - "Chunked"内存流

我正在寻找MemoryStream的实现,它不会将内存分配为一个大块,而是一组block。我想在内存(64位)中存储几GB的数据,并避免内存碎片的限制。 最佳答案 像这样:classChunkedMemoryStream:Stream{privatereadonlyList_chunks=newList();privateint_positionChunk;privateint_positionOffset;privatelong_position;publicoverrideboolCanRead{get{returntrue;}

c# - 锁语句的内存屏障

我最近读到有关内存障碍和重新排序的问题,现在我对此有些困惑。考虑以下场景:privateobject_object1=null;privateobject_object2=null;privatebool_usingObject1=false;privateobjectMyObject{get{if(_usingObject1){return_object1;}else{return_object2;}}set{if(_usingObject1){_object1=value;}else{_object2=value;}}}privatevoidUpdate(){_usingMetho

C# 事件内存泄漏

很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭10年前。这些未订阅的事件什么时候发生内存泄漏?我应该编写析构函数还是实现IDisposable来取消订阅事件?

c# - 使用 Unity 填充集合的方法

我有两个示例类classClassToResolve{privateList_coll;publicClassToResolve(Listcoll){_coll=coll;}}classCollectionItem{//...}我需要解析ClassToResolvevarclassToResolve=newClassToResolve(newList(){newCollectionItem(),newCollectionItem(),newCollectionItem()});现在我以某种方式解决它varclassToResolve=newClassToResolve(newList(