可以使用Runtime来获取到当前程序内存空间的状态
如下代码所示
Java Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| //-Xms16M -Xmx20M -Xmn8m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:-UseTLAB -XX:+UseSerialGC //新生代8M//eden4M //from/to2M //老年代8M package com.shadowfaxghh.test;
import java.text.DecimalFormat;
public class Main {
public static void main(String[] args) { System.out.println("MaxMemory="+toMBytes(Runtime.getRuntime().maxMemory()) +" MBytes");//堆最大内存空间//返回的单位是字节 System.out.println("TotalMemory="+toMBytes(Runtime.getRuntime().totalMemory()) +" MBytes");//堆当前内存空间 System.out.println("FreeMemory="+toMBytes(Runtime.getRuntime().freeMemory()) +" MBytes");//堆当前可用内存空间 System.out.println(); byte[] a=new byte[1*1024*1024]; System.out.println("MaxMemory="+toMBytes(Runtime.getRuntime().maxMemory()) +" MBytes");//堆最大内存空间 System.out.println("TotalMemory="+toMBytes(Runtime.getRuntime().totalMemory()) +" MBytes");//堆当前内存空间 System.out.println("FreeMemory="+toMBytes(Runtime.getRuntime().freeMemory()) +" MBytes");//堆当前可用内存空间 System.out.println(); } public static String toMBytes(long l){ double d=(double)l/1024d/1024d; DecimalFormat df = new DecimalFormat("#.00"); return df.format(d); } } |
输出结果如下
可以看到
对于最大内存空间,虽然我们分配的是20M,但是显示的只有18M
这是因为from/to各分配了2M,因为垃圾回收的需要,有一块from或to是保留用来复制存活对象的。显示少了2M就是这个原因。
下面的当前内存空间和当前可用内存空间也都是少了2M
其实GC日志中的新生代的total也是这样显示的。