为什么我为以下代码获取变量输出:
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 []一样)。
答案 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