示例代码:

public class Memory {
public static void main(String[] args) {
//当前虚拟机进程从操作系统申请的内存大小
System.out.println("当前内存:"+Runtime.getRuntime().totalMemory()/1024/1024+" MB");
//当前虚拟机进程从操作系统申请的内存空余量
System.out.println("空余内存:"+Runtime.getRuntime().freeMemory()/1024/1024+" MB");
//当前虚拟机进程从操作系统可申请的最大内存容量
System.out.println("可申请最大内存:"+ Runtime.getRuntime().maxMemory()/1024/1024+" MB");
}
}

当前内存:245 MB

空余内存:240 MB

可申请最大内存:3641 MB

说明:

提起java我们就不得不提起Java虚拟机。为什么叫它虚拟机呢,“虚拟机”是一个相对于“物理机”的概念,这两种机器都有执行代码的能力,对于“物理机”,他执行的代码主要是建立在操作系统上的一套指令集,直接运行在处理器,寄存器等硬件上;而对于“虚拟机”,它就像一个虚拟出来的“物理机”,注意是虚拟出来的,并不是真正的“物理机”,它的实现上也有一些类似“物理机”的指令集,而只要Java语言甚至其他语言通过编译得到的字节码准遵循这套指令集的规范,那么这些语言就能运行在虚拟机上。换句话说,Java程序要想执行,首先要在Java虚拟机上执行,然后虚拟机将这些操作映射为在相应操作系统物理机上的执行动作,再在物理机上执行。

还有一点需要明确是,Java虚拟机启动运行后,它相对于操作系统来说实际上也就是一个“普通的进程”,它可以有自己进程描述符,内存空间等,上面几行代码就说明了这中情况。

totalMemory()方法用于获取当前虚拟机进程从操作系统申请的内存大小。虽然虚拟机可以向操作系统申请内存,但是申请大小是受到限制的,而且申请过程也是一个动态的过程,即使用多少,申请多少直到最大值,这样可以减少维护内存的开销。假如一次性申请最大容量的内存,且只用很小的一部分,那么维护这块内存将是一个不小的开销。

freeMemory()方法用于获得当虚拟机进程从操作系统申请的内存空余量。为什么说是空余量呢,因为虽然虚拟机会动态申请内存,用多少申请多少,但是它仍然不能保证申请到的内存就一定够用,所以它每次申请的内存会有一点空余,那么通过这个方法就可以知道当前虚拟机有多大的空余内存。

maxMemory()方法用于获取当前虚拟机进程从操作系统可申请内存的最大容量。