我试图查看Runtime.freeMemory()的使用情况。
文档说它'返回Java虚拟机中的可用内存量'
我执行了一个简单的程序测试。计划如下:
public class Test {
public static void main(String a[]) throws Exception {
System.out.println("Total memory: " +Runtime.getRuntime().totalMemory());
System.out.println("Free memory: " +Runtime.getRuntime().freeMemory());
Integer intArr[]= new Integer[10000];
for(int i =0; i<10000;i++){
intArr[i] = new Integer(i+500);
}
System.out.println("Free memory: " +Runtime.getRuntime().freeMemory());
System.out.println("sample print :"+ intArr[0]);
System.out.println("sample print :"+ intArr[5000]);
System.out.println("sample print :"+ intArr[9999]);
}
}
输出:
总记忆:67108864
可用内存:61822408&lt;在分配10000个对象之前&gt;
可用内存:61822408&lt;分配10000个对象后,大小保持不变。 ?为何&GT;
样本打印:500
样本打印:5500
样本打印:10499
由于对象是在堆上创建的,第二次打印的“Free memory”值应该小于第一个输出,对吗?
但它打印相同的值。任何人都可以解释为什么它打印相同的价值?
答案 0 :(得分:3)
我知道这不是你想要的答案 - 但根据JavaDoc - freeMemory
返回:
近似到总金额 目前可用的内存 未来分配的对象,以 字节。
只是为了测试它 - 我拿了你的代码并跑了两次。一旦数组大小设置为10,000 - 一次使用100。 我之后还添加了另一个印刷品:
Integer intArr[]= new Integer[10000];
使用10,000
运行时 - 我得到了预期的结果,在数组实例化之后,空闲内存中的40,0016 bytes
减少了。
当使用100
运行时,我在阵列实例化之前和之后获得了相同数量的可用内存 - 不所需的效果。
由于大多数答案已经陈述 - 因为它是本机方法 - 依赖于JVM,因此可以在任何平台上采取不同的行动。
我使用Windows 7
在Eclipse built-in JVM (v3.6)
上运行。
但我认为这里的关键词是 - 近似。
答案 1 :(得分:1)
内存是从周围的操作系统以大块分配的。合并的10000个对象不够大,无法进行额外分配。
答案 2 :(得分:1)
刚检查了字节码..片段如下,它位于两个printf
的中间位置:
SIPUSH 10000
ANEWARRAY java/lang/Integer
ASTORE 1
所以它确实实际上以dinamically方式分配数组,而freeMemory
应返回不同的值。由于它没有这样做,我想它确实是平台/版本依赖,就像已经指出的那样。
例如,在我的机器上它实际上发生了变化:
Free memory: 81915960
Free memory: 81353824
只是另一个猜测:也许它取决于JVM的初始堆大小参数,因此如果JVM启动时已经准备好使用足够的堆,则不需要在某个阈值之前分配它(它是-Xms
设置,您可以尝试增加或减少它以查看是否有变化。