我的理解如何堆和垃圾收集工作:垃圾收集发生在代,存分配发生顺序,在此期间,垃圾收集免费/未使用的空间压缩由转移数据和形成将继续块,等等。

是否有任何标题分配的记忆区块都存在,并有多大,他们是(我听说这是8至16字节。净CLR)如果字节,文字或四个词对本?我感兴趣的任何信息JIT(Java)和CLR(.净框架或单)实施x86和64处理架构。

有帮助吗?

解决方案

相信报头大小是两个词 - 一个用于类型参考,一个用于同步块和其它标志。填充是(I相信)刚好足以圆总大小高达字的一个整数。

例如,对于在只是一个“INT”的引用类型需要在x86 12个字节,如下所示:

using System;

public class Foo
{
    int x;

    public Foo(int x)
    {
        this.x = x;
    }
}

public class Test
{
    static void Main(string[] args)
    {
        int length = int.Parse(args[0]);

        Foo x = new Foo(0);
        Foo[] array = new Foo[length];
        // Make sure that JITting the string constructor doesn't
        // change things
        long start = GC.GetTotalMemory(true);
        for (int i=0; i < length; i++)
        {
            array[i] = new Foo(i);
        }
        long end = GC.GetTotalMemory(true);

        GC.KeepAlive(array);
        GC.KeepAlive(x);

        decimal totalDecimal = end-start;
        Console.WriteLine(totalDecimal / length);
    }
}

一个有趣的点 - 因为某些原因System.Object的的一个实例为12个字节(在x86)代替我否则将所预测的8。这是因为如果最小尺寸为12个字节,但你的前四个字节的真实数据的自由:)

我不知道为什么报道的大小是不完全的整数,顺便说一句 - 我怀疑它的东西做的托管堆中的每个页面需要额外的内存,或类似的东西一点点。有时候,结果是超过12一点点,有时12岁以下的一点点 - 这似乎取决于给出的长度。 (这个答案的前一个版本曾在一个错误,它会分析第一个命令行参数,但随后忽略它。我已经修复了。)无论如何,我不认为这有点不准有任何与大小的存储器中的单个对象。

其他提示

一个完整的问题的答案实际上将是复杂的:相关的开销用的对象分配不仅取决于执行的细节特别是虚拟机,但是对于例也在产生的对象,会发生在(换句话说,相关的开销与特定的对象可以改变的生命周期的对象)。

有几个简单的工具,可用于估计的开销用于一个特定的对象,但没有强大的(例如检查出 http://java.sun.com/docs/books/performance/1st_edition/html/JPRAMFootprint.fm.html).

在爪哇,还有一个接口,可能会给你的对象包括大小的开销,请参阅 http://download-llnw.oracle.com/javase/6/docs/platform/jvmti/jvmti.html#GetObjectSize.

我不知道Java,但对于CLR有每引用的类型分配1个原生字的开销。在32个系统中,将4个字节,64位的系统中,将8个字节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top