gpt4 book ai didi

Java 和 .NET 堆开销

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:59 25 4
gpt4 key购买 nike

我了解堆和垃圾收集器的工作原理:垃圾收集按代发生,内存分配按顺序发生,在垃圾收集期间通过移动数据压缩空闲/未使用空间并形成连续 block 等。

是否存在分配内存块的 header ,它们有多大(我听说 .NET CLR 是 8-16 字节),是否存在字节、字或四字对齐?我对 x86 和 x64 处理器架构的 JIT (Java) 和 CLR(.NET Framework 或 Mono)实现的任何信息都感兴趣。

最佳答案

我相信标题大小是两个字 - 一个用于类型引用,一个用于同步块(synchronized block)和其他标志。填充(我相信)刚好足以将总大小四舍五入到整数个单词。

例如,一个只有“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 - 这似乎取决于给定的长度。 (这个答案的前一个版本有一个错误,它会解析第一个命令行 arg 但然后忽略它。我已经修复了它。)无论如何,我不认为这种轻微的不准确与大小有任何关系内存中的单个对象。

关于Java 和 .NET 堆开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/520922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com