为什么我为以下代码获取变量输出:
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()视为一种有趣的随机数生成器.