我在想,从“object”继承的对象有多少内存并且没有字段/属性需要?我想方法不会。对 ?我在说.net对象。从c#对象中获取的内存
回答
好了,因为这两个安德鲁和Guffa给了答案,我认为是错误的...
有对所有对象(在x86)的8个字节的开销,但有也 12的最小尺寸字节。我不知道为什么...但它意味着,这两个类都采取每个实例12个字节:
public class OneField
{
private int field;
}
public class NoFields
{
}
测试:
using System;
public class OneField
{
private int field;
}
public class NoFields {}
public class Test
{
static void Main(string[] args)
{
int size = int.Parse(args[0]);
switch (args[1])
{
case "NoFields":
TestNoFields(size);
break;
case "OneField":
TestOneField(size);
break;
}
}
static void TestNoFields(int size)
{
NoFields[] array = new NoFields[size];
long start = GC.GetTotalMemory(true);
for (int i=0; i < size; i++)
{
array[i] = new NoFields();
}
long end = GC.GetTotalMemory(true);
GC.KeepAlive(array);
Console.WriteLine("Size per instance: {0}",
(end-start)/(double)size);
}
static void TestOneField(int size)
{
OneField[] array = new OneField[size];
long start = GC.GetTotalMemory(true);
for (int i=0; i < size; i++)
{
array[i] = new OneField();
}
long end = GC.GetTotalMemory(true);
GC.KeepAlive(array);
Console.WriteLine("Size per instance: {0}",
(end-start)/(double)size);
}
}
这是丑陋的,因为我故意不去了任何泛型类型或其他任何可能导致问题的东西。一些测试运行:
>test 1000000 NoFields
Size per instance: 12.000024
>test 1000000 OneField
Size per instance: 12.000024
>test 1000 NoFields
Size per instance: 12
>test 1000 OneField
Size per instance: 12
(JITting开销等解释了为什么数量并不总是一个确切的整数 - 因此为什么我做除法的浮点数)。
测试与额外的int场演出使用量高达16,这证明它实际上是做一些合理的:)
关于最小12字节的好处,但我认为问题的精神与从“System.Object”“继承”的信息有关。虽然在x86上是正确的,但第一个字段是“免费的”,但没有'System.Object'的开销,前3个字段本来可以是免费的:)但是,对于这个重要区别,还是+1。 – 2009-08-13 16:37:30
使用引用类型引起的唯一开销是类型对象指针为4个字节,同步块索引为4个字节。
总共8字节的开销。
一个对象除了它自己的数据外还有两个引用/指针。
因此,在32位系统上,对象占用8个字节,在64位系统上则占用16个字节。
更正信息:
正如Jon所说的,对象的最小尺寸是12个字节。我迄今发现的信息表明,GC需要这一点。
不可以 - 由于某些原因,x86上的最小对象大小为12个字节,但您获得第一个字段为“免费”:) – 2009-08-13 16:32:42
根据http://msdn.microsoft.com/zh-cn/magazine/cc163791 .aspx由于某种原因,GC要求该对象至少为12个字节。 – Guffa 2009-08-13 16:39:32
- 1. 获取对象的内存
- 2. 从对象内获取父对象
- 3. 从mongodb c获取对象#
- 4. 获取从对象C#
- 5. 从C#中的对象获取类型
- 6. 从内存使用内存地址获取对象
- 7. C++从内存中删除对象
- 8. 如何从List C#中获取对象?
- 9. 是否可以从内存中获取所有对象?
- 10. 如何从内存地址获取相对对象?
- 11. Django内嵌formset - 获取保存对象
- 12. C++获取对象
- 13. 获取对象对象内的数据?
- 14. 如何获取对象内的对象?
- 15. 从内部类对象中获取外部类对象
- 16. 从内部类对象中获取外部类对象
- 17. 试图从内部对象和对象中获取信息PHP
- 18. c#从一个JSon对象内的数组获取索引
- 19. 从对象中获取对象名称
- 20. 从对象数组中获取对象
- 21. 从其他对象中获取对象
- 22. C#获取通用对象的对象
- 23. 从对象中获取值
- 24. 在C++中释放对象的内存
- 25. 从对象内部的对象获取数据
- 26. 如何从对象内部的对象获取/处理元素?
- 27. 如何从JTable获取存储对象
- 28. C#内存/对象理解
- 29. C#:从SqlConnection对象获取反馈?
- 30. c#从对象获取属性
好问题。我会说创造他们几百万,并看到之前和之后的内存差异。除非有人已经这样做了。 – 2009-08-13 16:24:04
这就是为什么我问。我需要知道具有数百万个对象的应用程序的内存使用情况。所以32位应用程序的答案是所有字段+8字节的大小。 – 2009-08-13 17:28:19