Runtime.Freememory()在两个连续调用之间返回变量值,在它们之间初始化数组?

时间:2012-05-08 17:54:06

标签: java memory-management runtime

为什么我为以下代码获取变量输出:

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 []一样)。

2 个答案:

答案 0 :(得分:2)

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

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

即使您花费数年时间研究某个JVM的行为并积累了深刻的智慧和知识,这些知识可以让您预测分配对freeMemory()结果的影响,当您切换到这个知识时,这些知识可能会突然变得毫无价值另一个JVM或只更新你当前的JVM。

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

答案 1 :(得分: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