C# 内存泄漏查询 - 为什么 GC 不释放本地范围的内存?
C# Memory leak query - Why GC is not releasing memory of the local scope?
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Before 1st call TestFunc");
TestFunc();
Console.WriteLine("After 1st call TestFunc");
Console.WriteLine("Before 2nd call TestFunc");
TestFunc();
Console.WriteLine("After 2nd call TestFunc");
Console.ReadLine();
}
public static void TestFunc()
{
List<Employee> empList = new List<Employee>();
for (int i = 1; i <= 50000000; i++)
{
Employee obj = new Employee();
obj.Name = "fjasdkljflasdkjflsdjflsjfkldsjfljsflsdjlkfajsd";
obj.ID = "11111111111111112222222222222222222222222222222";
empList.Add(obj);
}
}
}
public class Employee
{
public string Name;
public string ID;
}
我只在一个位置(本地范围)内创建了很多员工,当控件返回到 main 函数时,为什么 DOTNET 不释放内存?
假设每个函数调用都使用 1 GB 的内存,在函数 main 的末尾,应用程序仍然使用超过 1Gb 的内存。为什么 GC 在范围关闭后不收集?
这可能是一个简单的问题,任何帮助都会很棒。
GC 不会在作用域或函数调用结束时自动启动。根据 MS 文档:
当下列条件之一为真时发生垃圾收集:
•系统物理内存不足。这是由来自 OS 的低内存通知或主机指示的低内存检测到的。
•托管堆上分配的对象使用的内存超过了可接受的阈值。该阈值会随着流程的运行而不断调整。
•调用了GC.Collect 方法。几乎在所有情况下,您都不必调用此方法,因为垃圾收集器会连续运行。此方法主要用于特殊情况和测试。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Before 1st call TestFunc");
TestFunc();
Console.WriteLine("After 1st call TestFunc");
Console.WriteLine("Before 2nd call TestFunc");
TestFunc();
Console.WriteLine("After 2nd call TestFunc");
Console.ReadLine();
}
public static void TestFunc()
{
List<Employee> empList = new List<Employee>();
for (int i = 1; i <= 50000000; i++)
{
Employee obj = new Employee();
obj.Name = "fjasdkljflasdkjflsdjflsjfkldsjfljsflsdjlkfajsd";
obj.ID = "11111111111111112222222222222222222222222222222";
empList.Add(obj);
}
}
}
public class Employee
{
public string Name;
public string ID;
}
我只在一个位置(本地范围)内创建了很多员工,当控件返回到 main 函数时,为什么 DOTNET 不释放内存? 假设每个函数调用都使用 1 GB 的内存,在函数 main 的末尾,应用程序仍然使用超过 1Gb 的内存。为什么 GC 在范围关闭后不收集?
这可能是一个简单的问题,任何帮助都会很棒。
GC 不会在作用域或函数调用结束时自动启动。根据 MS 文档:
当下列条件之一为真时发生垃圾收集:
•系统物理内存不足。这是由来自 OS 的低内存通知或主机指示的低内存检测到的。
•托管堆上分配的对象使用的内存超过了可接受的阈值。该阈值会随着流程的运行而不断调整。
•调用了GC.Collect 方法。几乎在所有情况下,您都不必调用此方法,因为垃圾收集器会连续运行。此方法主要用于特殊情况和测试。