Tag: garbage collection

C#析构函数未按预期工作

请参阅下面的代码。 我希望它打印10,因为我已经显式调用了垃圾收集器。 但我总是输出0或20作为输出。 这是为什么? void Main() { Panda[] forest_panda = new Panda[10]; for(int i=0; i<forest_panda.GetLength(0);i++) { forest_panda[i]=new Panda("P1"); } for(int i=0; i<forest_panda.GetLength(0);i++) { forest_panda[i]=new Panda("P1"); } System.GC.Collect(); Console.WriteLine("Total Pandas created is {0}",Panda.population); } class Panda { public static int population=0; public string name; public Panda(string name) { this.name = name; population = population + 1; […]

如何以及何时处置/垃圾收集单例实例

我正在使用从嵌套类创建的Singleton实例。 这个实例保存了一些静态集合,这些集合在处理Singleton时被清除,但问题是我得到了对非null处理的Singleton的引用,它没有正确地进行垃圾回收。 我想知道WHEN以及如何完全处理和垃圾收集我的Singleton实例,以便在dispose(并设置为null)后再次查询实例时,会创建一个新实例。 我对Singleton实例使用以下嵌套模式: public class SingletonClass : IDisposable { private List _collection; private SingletonClass() { } public static SingletonClass Instance { get { return Nested.Instance; //line 1 – this line returns the non-null instance after dispose and setting the Singleton instance to null which is causing problems } } private void Init() { _collection […]

NamedScope和垃圾收集

(这个问题首先在Ninject Google Group中提出,但我现在看到Stackoverflow似乎更活跃了。) 我正在使用NamedScopeExtension将相同的ViewModel注入View和Presenter。 释放View后,内存分析显示Ninject缓存仍保留ViewModel。 如何让Ninject释放ViewModel? 当Form关闭和处置时,所有ViewModel都会被释放,但我正在使用Form中的Factory创建和删除Controls,并希望将ViewModel垃圾收集到(收集Presenter和View)。 有关问题的说明,请参阅以下UnitTest,使用dotMemoryUnit: using System; using FluentAssertions; using JetBrains.dotMemoryUnit; using Microsoft.VisualStudio.TestTools.UnitTesting; using Ninject; using Ninject.Extensions.DependencyCreation; using Ninject.Extensions.NamedScope; namespace UnitTestProject { [TestClass] [DotMemoryUnit(FailIfRunWithoutSupport = false)] public class UnitTest1 { [TestMethod] public void TestMethod() { // Call in sub method so no local variables are left for the memory profiling SubMethod(); // […]

垃圾收集器和静态类,变量

自从过去几天以来,有一点在我的脑海中浮现。 我想知道垃圾收集器如何使用静态类,变量? 众所周知,垃圾收集器会跟踪已在应用程序中创建的对象,并在不再使用时自动将其删除。 对于静态类,不会创建任何对象,并使用应用程序调试将其加载到内存中。 那么垃圾收集器处理静态类?

使用垃圾收集?

我想知道在调用Dispose()方法时执行了什么操作。 Object在Dispose()调用或Dispose()上快速释放所有资源,标记Object已准备好进行垃圾回收。 当我们将Object引用设置为NULL时发生了什么。 实际上我在.NET 2.0中有Windows表单应用程序。 并且我希望在经过一定时间后调用垃圾收集器(例如5分钟后)以收集所有未引用的对象。

内存堆安全性:字符串垃圾收集

我最近一直在为我的公司进行安全代码审查,并使用名为Fortify360的工具。 它将识别代码的许多问题并描述问题。 它提出的一个有趣的问题是我没有找到任何其他信息如下: “存储在内存中的敏感数据(如密码)如果存储在托管的String对象中,可能会泄露。字符串对象没有固定,因此垃圾收集器可以随意重定位这些对象,并在内存中留下几个副本。这些对象是默认情况下没有加密,所以任何能够读取进程内存的人都能看到内容。此外,如果进程’内存被换出到磁盘,则字符串的未加密内容将被写入交换文件。 ,因为String对象是不可变的,所以只能通过CLR垃圾收集器从内存中删除String的值。除非CLR内存不足,否则不需要运行垃圾收集器,因此不能保证何时垃圾将发生收集。如果应用程序崩溃,应用程序的内存转储可能会泄露敏感数据。“ 所有这些我理解为很有道理,而且我对这个问题的研究非常标准。 问题是:我该如何解决这个问题? 假设有问题的类不能从iDisposableinheritance(非常大的应用程序,并且在所讨论的字符串之后很久就需要该类)。 是否有另一种手动内存管理方式来处理特定字符串而不调用垃圾收集器,GC.Collect()?? 提前感谢您的帮助。 亚历克斯

C#禁用USB ReadPipe的垃圾回收

我试图使用FTDI的D3XX.NET从USB端口收集数据。 收集数据,然后将其发送到快速傅立叶变换以绘制光谱。 即使您错过了一些数据,这也可以正常工作。 你不能说。 但是,如果您希望将此数据发送到音频输出组件,则会发现数据丢失。 这就是我的问题所在。 收集数据然后将其发送到音频设备。 所有数据包都在所需的时间范围内完成。 但是,音频正在丢弃它出现的数据。 这是一张正弦波在音频输出中的样子: 您可以看到一些数据在开始时丢失,并且似乎在结束时缺少整个周期。 这只是一个例子,它一直在变化。 有时似乎数据不存在。 我已经完成了整个处理链,我非常确定声音的数据包正在制作它。 我已经使用过JetBrains性能分析器。 我发现如下:ReadPipe方法需要8.5ms,这正是您期望读取的内容。 到现在为止还挺好。 ReadPipe命令完成后,您有0.5ms的时间来执行另一个ReadPipe,否则您将丢失一些数据。 查看分析器输出,我看到: ReadPipe需要8.5ms,然后有这个垃圾收集条目,平均需要1.6ms。 如果这确实偶尔发生,那么我丢失了一些数据。 所以这是代码:它是一个后台工作者: private void CollectData(object sender, DoWorkEventArgs e) { while (keepGoing) { ftStatus = d3xxDevice.ReadPipe(0x84, iqBuffer, 65536, ref bytesTransferred); //read IQ data – will get 1024 pairs – 2 bytes per value _waitForData.Set(); } } […]

为什么我们需要对某些对象使用Dispose()方法? 垃圾收集器为什么不这样做?

问题是:为什么我们需要在某些对象上调用Dispose() ? 为什么垃圾收集器在超出范围时收集它? 我试图理解为什么它被实现的原因。 我的意思是,当垃圾收集器从范围对象中收集时调用Dispose()会不会更容易。

防止在非托管代码中使用的托管引用的垃圾回收

我的C#应用​​程序使用包装的C ++代码进行计算。 C ++标题: __declspec(dllexport) void SetVolume(BYTE* data, unsigned int width); C ++ / CLI包装器: void SetVolume(array^ data, UInt32 width) { cli::pin_ptr pdata = &data[0]; pal->SetVolume(pdata, width); } C# : public startCalc() { byte[] voxelArr = File.ReadAllBytes(“Filtered.rec”); palw.SetVolume(voxelArr, 490); //GC.KeepAlive(voxelArr); makes no sense } C ++ SetVolume函数启动异步计算。 voxelArr不再从托管端引用,并且是垃圾回收。 在非托管代码完成工作而不将voxelArr声明为全局变量之前,如何防止此引用的垃圾收集? 创建数组副本不是一个选项,因为实际上有很多数据。 startCalc()内部的主动等待也不好。

为什么c#垃圾收集器在满足请求之前不会继续尝试释放内存?

考虑以下代码: using System; namespace memoryEater { internal class Program { private static void Main(string[] args) { Console.WriteLine(“alloc 1”); var big1 = new BigObject(); Console.WriteLine(“alloc 2”); var big2 = new BigObject(); Console.WriteLine(“null 1”); big1 = null; //GC.Collect(); Console.WriteLine(“alloc3”); big1 = new BigObject(); Console.WriteLine(“done”); Console.Read(); } } public class BigObject { private const uint OneMeg = 1024 […]