释放对象和列表使用的内存
本文关键字:内存 列表 对象 释放 | 更新日期: 2023-09-27 17:57:19
我试图理解垃圾收集过程,我想我明白了。但是当我处理某些代码时,它并没有按我的预期工作。在下面的代码中,我刚刚创建了 1.000.000 对象并将它们添加到列表中。过了一会儿,没有对象,但记忆卡住了,没有减少。如何在删除所有对象后释放内存?
谢谢
private void button1_Click(object sender, EventArgs e)
{
List<Test> tesst = new List<Test>();
for (long i = 0; i < 1000000; i++)
{
using (Test test = new Test())
{
test.LongObj = i;
test.StrObj = i.ToString();
test.DecObj = Convert.ToDecimal(i);
tesst.Add(test);
}
}
Process proc = Process.GetCurrentProcess();
proc.Refresh();
label1.Text = Test.counter.ToString();
label2.Text = (proc.PrivateMemorySize64 / 1048576).ToString();
for (int i = 0; i < tesst.Count; i++)
{
tesst[i] = null;
}
tesst.Clear();
tesst = null;
}
private void button2_Click(object sender, EventArgs e)
{
Process proc = Process.GetCurrentProcess();
proc.Refresh();
label1.Text = Test.counter.ToString();
label2.Text = (proc.PrivateMemorySize64 / 1048576).ToString();
}
和示例类
public class Test : IDisposable
{
public static long counter = 0;
public long LongObj { get; set; }
public string StrObj { get; set; }
public decimal DecObj { get; set; }
public Test()
{
Interlocked.Increment(ref counter);
}
~Test()
{
Interlocked.Decrement(ref counter);
}
public void Dispose()
{
}
}
为什么要尝试手动释放内存? 有正当的理由,但我想确保你处于需要它的情况。
您可以通过调用 GC.Collect()
并选择性地使用参数告诉它要收集哪一代来强制垃圾回收。 您可以在此处阅读有关此内容的更多信息,它包括与您尝试执行的操作类似的测试。
你如何在删除所有对象后释放内存?
没有,你让GC做它的工作。强制垃圾回收(使用System.GC.Collect()
)几乎总是一个坏主意。
这似乎确实是一个需要重新考虑流程的场景。 我不认为这是一项与GC手动交互的工作。 也许如果你在不同的问题中发布一些代码,人们可以抛出一些想法来解决问题?