C# 额外列表<&燃气轮机;内存中的对象
考虑以下简单代码:C# 额外列表<&燃气轮机;内存中的对象,c#,list,memory,C#,List,Memory,考虑以下简单代码: class Program { static List<Data> listData = new List<Data>(); static void Main(string[] args) { for (int i = 0; i < 5; i++) { Data newData = new Data(); newData.num1 = i;
class Program
{
static List<Data> listData = new List<Data>();
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
Data newData = new Data();
newData.num1 = i;
newData.num2 = i * 5;
listData.Add(newData);
}
Console.ReadLine();
}
}
class Data
{
public int num1 { get; set; }
public int num2 { get; set; }
}
类程序
{
静态列表listData=新列表();
静态void Main(字符串[]参数)
{
对于(int i=0;i<5;i++)
{
Data newData=新数据();
newData.num1=i;
newData.num2=i*5;
listData.Add(newData);
}
Console.ReadLine();
}
}
类数据
{
公共整数num1{get;set;}
公共int num2{get;set;}
}
出于某种原因,在为这段代码分析内存时,它显示内存中有2Data[]对象(我假设是listData对象):
有人能解释一下原因吗?我想你可以指望垃圾收集器来完成它的工作。。。别担心
(我没有足够的声誉来发表评论)我想你可以指望垃圾收集器来完成它的工作。。。别担心
(我没有足够的声誉将此作为评论发布)不,内存中没有额外的
列表,您有两个数据[]
数组。哪些是您创建的列表对象的基础存储
列表以一个空数组开始,第一个Add()调用创建一个可以容纳4个元素的Data[]数组。它在第五次Add()调用时运行,现在它创建了一个Data[]数组,该数组的大小是原来的两倍,它可以存储8个元素。内存分析器仍然可以看到垃圾数据[]数组,GC还没有运行
您可以使用Capacity属性对此进行优化。更多详细信息请参见。不,内存中没有额外的列表,您有两个数据[]
数组。哪些是您创建的列表对象的基础存储
列表以一个空数组开始,第一个Add()调用创建一个可以容纳4个元素的Data[]数组。它在第五次Add()调用时运行,现在它创建了一个Data[]数组,该数组的大小是原来的两倍,它可以存储8个元素。内存分析器仍然可以看到垃圾数据[]数组,GC还没有运行
您可以使用Capacity属性对此进行优化。有关更多详细信息,请参见。您是如何确定内存中有2个列表对象的?@codequestioneer使用dotMemory 4和ANTS Profiler。这是什么控制台应用程序。数据[]
?要计算您使用了多少实例,请使用listData.count
@AsfK listData.count将提供数据的数量,而不是listData的实例。您是如何计算出内存中有2个列表对象的?@codequestioneer使用dotMemory 4和ANTS Profiler。这是什么ConsoleApplication.Data[]
?要计算有多少实例,请使用listData.count
@AsfK listData.count将提供数据的数量,而不是listData的实例。谢谢,但强制GC不会删除它。我想了解为什么有两个。谢谢,但强制GC并不会删除它。我想理解为什么有两个。谢谢解释,但是当我强制GC时,没有任何内容被删除。你必须问另一个问题,先读。谢谢解释,但是当我强制GC时,没有任何内容被删除。你必须问另一个问题,先读。