gpt4 book ai didi

java - int 在 Sun 的 64 位 JVM 上占用多少内存?

转载 作者:行者123 更新时间:2023-12-02 09:19:05 25 4
gpt4 key购买 nike

我知道 Java 的实现会尽一切努力向开发人员隐藏这些信息,但我正在构建一个不依赖于第三方库的内存绑定(bind)算法,因此这些信息会派上用场。

特别是,我分配了许多大型 int[] 数组作为实例变量。我很快就会研究更紧凑的表示,但现在我有兴趣知道普通数组使用了多少空间。

最佳答案

好吧,int 字段可能由于填充而最终占用超过 4 个字节......但从根本上来说它是 4 个字节(32 位)。至于它是否确实需要超过4个字节,你必须通过实验才能知道。对于对象内的字段来说,这相当容易;对于基于堆栈的 int 值来说更困难。

例如,大型int数组将始终占用大约其长度的4倍(加上长度等的少量开销)。我不相信元素之间会应用填充 - 尽管验证这一点相对容易。 Runtime.totalMemory() - Runtime.freeMemory() 返回的值应谨慎使用,但如果您在一次运行中分配一个包含 100 万个整数的数组,然后在另一次运行中分配 200 万个整数,则接下来是 300 万个整数,等等,应该相当清楚发生了什么。

示例代码:

public class Test {
public static void main(String[] args) {
int size = Integer.parseInt(args[0]);

long before = getUsedMemory();
int[] array = new int[size];
long after = getUsedMemory();

long difference = after - before;
System.out.println("Total difference: " + (after - before));
System.out.println("Per element: " + ((double) difference) / size);
System.out.println(array); // Make sure the array isn't GC'd early
}

private static long getUsedMemory() {
Runtime rt = Runtime.getRuntime();
return rt.totalMemory() - rt.freeMemory();
}
}

在我的机器上,尝试使用 100000、2000000 和 3000000 进行此操作,所有运行都会得到“4*size + 16”字节。

关于java - int 在 Sun 的 64 位 JVM 上占用多少内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5087906/

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