Java-Runtime.freemory()

Java-Runtime.freemory(),java,Java,我试图查看Runtime.freemory()的用法 文档称它“返回Java虚拟机中的可用内存量” 今年我执行了一个简单的程序测试。计划如下: public class Test { public static void main(String a[]) throws Exception { System.out.println("Total memory: " +Runtime.getRuntime().totalMemory()); System.out.println(

我试图查看Runtime.freemory()的用法

文档称它“返回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]);
 }  
}
公共类测试{
公共静态void main(字符串a[])引发异常{
System.out.println(“总内存:+Runtime.getRuntime().totalMemory());
System.out.println(“空闲内存:+Runtime.getRuntime().freemory());
整数intArr[]=新整数[10000];
对于(int i=0;i

可用内存:61822408<即使分配了10000个对象,大小仍保持不变。为什么?>

样本印刷:500

样本印刷:5500

印刷样本:10499

因为对象是在堆上创建的,所以第二次打印的“空闲内存”值应该小于第一次输出,对吗


但是它打印相同的值。谁能解释为什么它打印相同的值?< /P> < P>内存是从周围的操作系统中分块分配的。这10000个对象组合不太大,导致额外的分配。

< P>刚刚检查了字节码。printf

SIPUSH 10000
ANEWARRAY java/lang/Integer
ASTORE 1
因此,它实际上是以动态方式分配数组的,
freemory
应该返回一个不同的值。因为它没有这样做,我想它确实是平台/版本依赖的,就像已经指出的那样

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

Free memory: 81915960
Free memory: 81353824

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

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

总金额的近似值 当前可用于 未来分配的对象,以 字节

为了测试它,我使用了您的代码并运行了两次。一次是将数组大小设置为10000,另一次是100。 我还添加了另一个打印:

Integer intArr[]= new Integer[10000];
使用
10000
运行时,我得到了预期的结果,在数组实例化之后,空闲内存中减少了
400016字节

使用
100
运行时,我在数组实例化前后获得了完全相同的可用内存量-没有达到所需的效果

正如大多数答案所述——因为它是本机方法——依赖于JVM,因此可以在任何平台上采取不同的行动。 我使用
Eclipse内置JVM(v3.6)
windows7
上运行


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

你必须尝试比10000个整数对象大得多的东西才能看到区别。@CoolBeans-平台和JVM相关。在我的机器上运行上述代码(Linux+Sun JVM 1.6_22)显示可用内存下降。@Brian Roach-这很有道理。谢谢!您使用的是什么操作系统,以及Java的哪个版本?您的代码在我的机器上的行为与预期一致。@Brain-OS:Windows XP,JDK-1.6.0_05。谢谢您的回复!这不应该是事实,因为
freemory
应该与JVM内部管理的内存相关赛尔夫,不确定。平台和JVM相关。在我的机器上运行OP的代码(Linux+Sun JVM 1.6_22)显示空闲内存减少。你可以节省这项工作-这不是真的。