GC.GetTotalMemory的使用及其返回值

本文关键字:返回值 GetTotalMemory GC | 更新日期: 2023-09-27 18:15:05

我在15KB大小的磁盘上保存了一个二进制文件,但为什么它的内存大小总是只有4字节

long mem1=GC.GetTotalMemory(false);
Object[] array= new Object[1000000];
array[1]=obj; // obj is the object content of the file before it is saved on disk
long mem2=GC.GetTotalMemory(false);
long sizeOfOneElementInArray=(mem2-mem1)/1000000;

我在某个地方说错了。我认为这是不正确的,因为4个字节甚至不足以存储helloworld字符串,但为什么它不正确呢。谢谢你的帮助。

GC.GetTotalMemory的使用及其返回值

假设将obj分配给数组中的索引[1],会占用大量字节吗?你所要做的就是指定一个参考。不仅如此,new Object[1000000]所做的只是创建一个数组(将1000000个Object和Object[]所需的内存关联起来的空间(,而不是分配1000000个Object。我相信有人可以详细说明正在使用的内部数据结构,以及为什么会出现4个字节。

要实现的关键是,将obj分配给o[1]并不是为obj分配额外的内存。如果您试图在分配obj之前确定近似调用GC.GetTotalMemory,则在分配之后。在您的测试中,在调用第一个GC.GetTotalMemory 之前已经分配了obj

通常,当MSDN文档说一个数字是当前分配在托管内存中的字节数的最佳近似值时,依赖它来获得准确的值是个坏主意:-(

抛开玩笑不谈,如果您的对象"o"没有在示例中第3行之后的函数中使用,那么它可能是在第3行和第4行之间收集的。只是猜测。

首先,如果我按照编写的方式使用代码,x对我来说变成0,因为分配后没有使用o,所以GC可以收集它。下面假设没有收集o(例如,在方法末尾使用GC.KeepAlive(o)(。

让我们仔细看看代码的两行重要内容(假设32位体系结构(:

Object[] o = new Object[1000000];

这一行分配1000000*4+16个字节。数组中的每个元素占用4个字节,因为它是对对象的引用(指针(。16字节是数组的开销。

o[1] = obj;

此行将o中的一个引用更改为对obj的引用。这一行正好分配0个字节。

我不知道你为什么对结果感到困惑。它必须是4,除非代码的前一部分有一些未引用的对象。在这种情况下,它可能小于4(甚至是负数(。当然,如果这是一个多线程的应用程序,结果可能几乎是任何东西,这取决于其他线程的作用

这一切都假设GetTotalMemory()是精确的,这不是必须的。

根据我的经验,marshal.sizeof()通常是比询问垃圾收集器更好的获取对象真实大小的方法。

http://msdn.microsoft.com/en-us/library/y3ybkfb3.aspx