Java-Runtime.freemory()
我试图查看Runtime.freemory()的用法 文档称它“返回Java虚拟机中的可用内存量” 今年我执行了一个简单的程序测试。计划如下: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(
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)显示空闲内存减少。你可以节省这项工作-这不是真的。