Java - Runtime.freeMemory()

时间:2011-04-05 17:23:13

标签: java

我试图查看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”值应该小于第一个输出,对吗?

但它打印相同的值。任何人都可以解释为什么它打印相同的价值?

3 个答案:

答案 0 :(得分:3)

我知道这不是你想要的答案 - 但根据JavaDoc - freeMemory返回:

  

近似到总金额   目前可用的内存   未来分配的对象,以   字节。

只是为了测试它 - 我拿了你的代码并跑了两次。一旦数组大小设置为10,000 - 一次使用100。 我之后还添加了另一个印刷品:

Integer intArr[]= new Integer[10000];

使用10,000运行时 - 我得到了预期的结果,在数组实例化之后,空闲内存中的40,0016 bytes减少了。

当使用100运行时,我在阵列实例化之前和之后获得了相同数量的可用内存 - 所需的效果。

由于大多数答案已经陈述 - 因为它是本机方法 - 依赖于JVM,因此可以在任何平台上采取不同的行动。 我使用Windows 7Eclipse 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设置,您可以尝试增加或减少它以查看是否有变化。

相关问题