4

为什么我得到以下代码的变量输出:

Runtime rt = Runtime.getRuntime();
long x,y;
x = rt.freeMemory();
char z[] = new char[Index];
y = rt.freeMemory();

System.out.println("Difference = " + (x-y))

对于较小的索引值(<10000),输出为零,但对于 >=100000 的值,值为 200016。对于每个零添加,它变为 2000016。

这怎么可能。[已编辑]我的目标是在内存中找到数据对象的大小(在代码中使用 - 就像这里我使用了索引大小的 Char z[])。

4

2 回答 2

2

您的假设似乎是,如果您有 n 字节的空闲内存并分配 m 字节,那么之后您将拥有 nm 字节的空闲内存。

这是一个合理的假设,但在存在异步垃圾收集器的情况下是错误的,它们会或不会按照他们认为合适的方式进行内存压缩。

即使你花费数年时间研究某个 JVM 的行为并积累了深厚的智慧和知识,可以让你预测分配对 freeMemory() 结果的影响,但当你切换到另一个 JVM 或只更新您当前的。

因此,相信我们长辈,并将Runtime.freeMemory()其视为一种有趣的随机数生成器。

于 2012-05-08T18:54:35.503 回答
0

我写System.gc() 了,你可以看到区别。

    Runtime rt = Runtime.getRuntime();
    long x,y;
    System.gc();
    x = rt.freeMemory();
    char z[] = new char[1000];
    y = rt.freeMemory();

    System.out.println("X = " + (x));
    System.out.println("Y = " + (y));
    System.out.println("Difference = " + (x-y));

输出

X = 16179672
Y = 16085904
Difference = 93768
于 2012-05-08T18:01:56.860 回答