我试图找出我的对象需要多少内存才能看到它们中有多少内存在大对象堆上(超过85,000字节).
对于每个对象的任何引用类型等,添加4为int,8为长,4(或8如果你在64位)是简单的,或者是方法,属性等的开销.
我试图使用以下代码确定.NET数组(在32位进程中)标头的开销:
long bytes1 = GC.GetTotalMemory(false);
object[] array = new object[10000];
for (int i = 0; i < 10000; i++)
array[i] = new int[1];
long bytes2 = GC.GetTotalMemory(false);
array[0] = null; // ensure no garbage collection before this point
Console.WriteLine(bytes2 - bytes1);
// Calculate array overhead in bytes by subtracting the size of
// the array elements (40000 for object[10000] and 4 for each
// array), and dividing by the number of arrays (10001)
Console.WriteLine("Array overhead: {0:0.000}",
((double)(bytes2 - bytes1) - …Run Code Online (Sandbox Code Playgroud) .NET中Object的内存开销是多少?我在谈论一个任意的简单对象......内部.NET工作或引用的开销:
var obj = new System.Object();
Run Code Online (Sandbox Code Playgroud)
obj在堆中占用了多少空间?
如何确定.NET中的Class是大还是小?它是根据它的属性或字段的数量,其属性/字段的数据类型来衡量的吗?或返回类型的方法?它的方法的参数?访问其方法的修饰符,虚方法?谢谢..
class A
{
string x { get; set; }
}
class B
{
int x { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,如果我像这样实例化A类和B类
A objA = new A();
B objB = new B();
Run Code Online (Sandbox Code Playgroud)
类objA是更大的一个,因为它包含一个String属性而objB只包含一个Int?虽然我没有为它的财产设定任何价值.谢谢
编辑:只是为了澄清我的问题
假设我有一堂课
public class Member
{
public string MainEmpId { get; set; }
public string EmpId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和另一堂课
public class User
{
public string AccessLevel { get; set; }
public string DateActivated { get; set; }
public string FirstName { get; set; } …Run Code Online (Sandbox Code Playgroud) 所以我只是从微软测试CLR Profiler,我做了一个小程序,创建了一个包含1,000,000个双打的List.我检查了堆,结果列表<>大小大约是124KB(我不记得确切,但它就在那附近).这真的震撼了我的世界,如果它有100万双打怎么可能是124KB呢?无论如何,之后我决定检查双[1000000].令我惊讶的是(因为这是我所期望的List <> = P),因此数组大小为7.6MB.巨大的差异!!
他们怎么会不一样?List <>如何管理其项目(令人难以置信)内存效率?我的意思是,它不像其他7.5 mb在其他地方,因为在我创建了100万双打之后,应用程序的大小大约增加了3或4 KB.