【问题标题】:Java - Runtime.freeMemory()Java - Runtime.freeMemory()
【发布时间】:2011-07-30 04:15:35
【问题描述】:

我试图查看 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

可用内存:61822408

样本打印:500

样本打印:5500

样本打印:10499

由于对象是在堆上创建的,所以第二次打印的 'Free memory' 值应该小于第一次输出,对吧?

但它打印相同的值。谁能解释为什么它打印相同的值?

【问题讨论】:

  • 您必须尝试比 10000 个整数对象大很多的东西才能看到差异。
  • @CoolBeans - 依赖于平台和 JVM。在我的机器(Linux + Sun JVM 1.6_22)上运行上述代码显示可用内存下降。
  • @Brian Roach - 这是有道理的。谢谢!
  • 您使用的是什么操作系统,以及 Java 的哪个版本?您的代码在我的机器上按预期运行。
  • @Brain - 操作系统:Windows XP,JDK -1.6.0_05。感谢您的回复!

标签: java


【解决方案1】:

我知道这不是您想要的答案 - 但根据 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)

但我认为这里的关键词是 - 近似

【讨论】:

    【解决方案2】:

    内存是从周围的操作系统大块分配的。合并的 10000 个对象不足以导致额外分配。

    【讨论】:

    • 这不应该是事实,因为freeMemory 应该与内部由 JVM 本身管理的内存有关,你不确定..
    • 平台和JVM相关。在我的机器(Linux + Sun JVM 1.6_22)上运行 OP 的代码显示可用内存下降
    【解决方案3】:

    刚查了字节码..片段如下,在两个printf的中间:

    SIPUSH 10000
    ANEWARRAY java/lang/Integer
    ASTORE 1
    

    所以它实际上是动态地分配数组,freeMemory 应该返回一个不同的值。由于它没有这样做,我猜它确实是平台/版本相关的,就像已经指出的那样。

    例如,在我的机器上它实际上发生了变化:

    Free memory: 81915960
    Free memory: 81353824
    

    只是另一个猜测:可能它取决于 JVM 的初始堆大小参数,因此如果 JVM 启动时已经有足够的堆可供使用,则不需要在某个阈值之前分配它(它是-Xms 设置,您可以尝试增加或减少它以查看是否有变化)。

    【讨论】:

    • 您可以省去这项工作 - 这不是真的。
    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多