最近写代码,一直思考循环还未结束的情况下,循环体内创建后的对象是否会被打上垃圾数据标记,进而被垃圾回收器发现及时回收。通过测试发现循环未结束情况下之前创建的对象会被垃圾回收器识别,能够及时回收释放内存。
代码如下:
Console.WriteLine("Hello, World!");
for (int i = 0; i < 40000000; i++)
{
User user = new User();
user.Name = $"用户{i}";
user.Address = $"地址{i}";
//为了延长执行时间方便查看GC垃圾回收情况
if (i % 1000 == 0)
{
Thread.Sleep(1);
}
}
Console.WriteLine("sucess");
Console.ReadKey();
VS诊断工具结果:可以发现循环还未完成之前,GC一直在工作着。
对于网上所说,在循环体外定义对象变量垃圾回收器能够更快进行工作,对此也进行了代码测试
代码如下:
Console.WriteLine("Hello, World!");
User user = null;
for (int i = 0; i < 40000000; i++)
{
user = new User();
user.Name = $"用户{i}";
user.Address = $"地址{i}";
//为了延长执行时间方便查看GC垃圾回收情况
if (i % 1000 == 0)
{
Thread.Sleep(1);
}
}
Console.WriteLine("sucess");
Console.ReadKey();
VS诊断工具结果:
通过两次效果对比并未发现太大区别,在循环体内定义对象变量还是循环体外定义变量都是可取的。