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

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

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

最佳答案 您的假设似乎是如果您有n个字节的空闲内存,并分配m个字节,那么之后您将拥有n-m个字节的空闲内存.

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

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

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

点赞