【参考】Java基础(九)Runtime类freeMemory,totalMemory,maxMemory.
Runtime.getRuntime().maxMemory()
maxMemory()方法返回的是:
java虚拟机(这个进程)能够从操作系统那里挖到的最大的内存,以字节为单位;
可以自己配置大小:-Xmx512M ( 默认64M,即
64*1024*1024
字节)
Runtime.getRuntime().totalMemory()
totalMemory()方法返回的是:
java虚拟机已经从操作系统那里挖过来的内存总大小,也就是java虚拟机这个进程此时此刻的内存大小;
Runtime.getRuntime().freeMemory()
freeMemory()方法返回的是:
JVM这个进程从操作系统挖过来的内存里还没有用上内存大小;
如果在运行java的时候没有添加 -Xms 参数:
在java程序运行的过程中,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少,但是java虚拟机100%的情况下是会稍微多挖一点的,直挖到maxMemory()
为止,所以totalMemory()
是慢慢增大的,此时freeMemory()
的值一般情况下都是很小的。
如果在运行java的时候用了 -Xms参数:
Java程序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,然后在这些内存用的差不多的时候,再去挖;这个时候,挖过来的内存可能大部分没用上,所以这个时候freeMemory()
可能会有些大。
测试代码
System.out.println("java虚拟机从操纵系统那里挖到的最大的内存 maxMemory : "+Runtime.getRuntime().maxMemory()/1024/1024+"M");
System.out.println("java虚拟机已经从操作系统那里挖过来的内存 totalMemory : "+Runtime.getRuntime().totalMemory()/1024/1024+"M");
System.out.println("java虚拟机从操纵系统挖过来还没用上的内存 freeMemory : "+Runtime.getRuntime().freeMemory()/1024/1024+"M");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
byte[] b1 = new byte[3*1024*1024];
System.out.println("java虚拟机从操纵系统那里挖到的最大的内存 maxMemory "+Runtime.getRuntime().maxMemory()/1024/1024+"M");
System.out.println("java虚拟机已经从操作系统那里挖过来的内存 totalMemory : "+Runtime.getRuntime().totalMemory()/1024/1024+"M");
System.out.println("java虚拟机从操纵系统挖过来还没用上的内存 freeMemory : "+Runtime.getRuntime().freeMemory()/1024/1024+"M");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
byte[] b2 = new byte[4*1024*1024];
System.out.println("java虚拟机从操纵系统那里挖到的最大的内存 maxMemory "+Runtime.getRuntime().maxMemory()/1024/1024+"M");
System.out.println("java虚拟机已经从操作系统那里挖过来的内存 totalMemory : "+Runtime.getRuntime().totalMemory()/1024/1024+"M");
System.out.println("java虚拟机从操纵系统挖过来还没用上的内存 freeMemory : "+Runtime.getRuntime().freeMemory()/1024/1024+"M");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");