转载自:http://blog.csdn.net/zhanglongit/article/details/7556708
@Override
public long getJavaHeap ()
{
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
totalMemory-freeMemory等于jvm真正已经使用的内存了
最近在网上看到一些人讨论到java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory ()这几个方法的一些问题,很多人感到很疑惑,为什么,在java程序刚刚启动起来的时候freeMemory()这个方法返回的只有一两兆字节,而随着 java程序往前运行,创建了不少的对象,freeMemory()这个方法的返回有时候不但没有减少,反而会增加。这些人对freeMemory()这 个方法的意义应该有一些误解,他们认为这个方法返回的是操作系统的剩余可用内存,其实根本就不是这样的。这三个方法反映的都是java这个进程的内存情 况,跟操作系统的内存根本没有关系。下面结合totalMemory(),maxMemory()一起来解释。把下面的源代码编译以后,在class文件所在的目录里面,分别用java -cp . Untitled1 和java -cp . -Xms80m -Xmx80m Untitled1 运行,看看结果如何,有助于理解上面的阐述。
public class Untitled1 { public Untitled1() {} public static void main(String[] args) { System.out.println(Runtime.getRuntime().freeMemory()); System.out.println(Runtime.getRuntime().totalMemory()); System.out.println(Runtime.getRuntime().maxMemory()); long t = System.currentTimeMillis(); try { Thread.sleep(30000); } catch (Exception ee) { ee.printStackTrace(); } String[] aaa = new String[2000000]; System.out.println(Runtime.getRuntime().freeMemory()); System.out.println(Runtime.getRuntime().totalMemory()); System.out.println(Runtime.getRuntime().maxMemory()); try { Thread.sleep(30000); } catch (Exception ee) { ee.printStackTrace(); } for (int i = 0; i < 2000000; i++) { aaa[i] = new String("aaa"); } System.out.println(Runtime.getRuntime().freeMemory()); System.out.println(Runtime.getRuntime().totalMemory()); System.out.println(Runtime.getRuntime().maxMemory()); try { Thread.sleep(30000); } catch (Exception ee) { ee.printStackTrace(); } } }