獲取系統內存空間和物理內存空間

//談談Runtime類中的freeMemory,totalMemory,maxMemory等幾個方法
/*
*maxMemory()這個方法返回的是java虛擬機(這個進程)能構從操作系統那裏挖到的最大的內存,以字節爲單位,如果在運行java程序的時 候,沒有添加-Xmx參數,那麼就是*64兆,也就是說maxMemory()返回的大約是64*1024*1024字節,這是java虛擬機默認情況下能 從操作系統那裏挖到的最大的內存。如果添加了-Xmx參數,將以這個參數後面
*的值爲準,例如java -cp ClassPath -Xmx512m ClassName,那麼最大內存就是512*1024*0124字節。


*totalMemory()這個方法返回的是java虛擬機現在已經從操作系統那裏挖過來的內存大小,也就是java虛擬機這個進程當時所佔用的所有 內存。如果在運行java的時候沒有添加*-Xms參數,那麼,在java程序運行的過程的,內存總是慢慢的從操作系統那裏挖的,基本上是用多少挖多少,直 挖到maxMemory()爲止,所以totalMemory()是慢慢增大的。
*如果用了-Xms參數,程序在啓動的時候就會無條件的從操作系統中挖- Xms後面定義的內存數,然後在這些內存用的差不多的時候,再去挖。


*freeMemory()是什麼呢,剛纔講到如果在運行java的時候沒有添加-Xms參數,那麼,在java程序運行的過程的,內存總是慢慢的從操 作系統那裏挖的,基本上是用多少挖多
*少,但是java虛擬機100%的情況下是會稍微多挖一點的,這些挖過來而又沒有用上的內存,實際上就是 freeMemory(),所以freeMemory()的值一般情況下都是很小的,但是如*果你在運行java程序的時候使用了-Xms,這個時候因爲程 序在啓動的時候就會無條件的從操作系統中挖-Xms後面定義的內存數,這個時候,挖過來的內存可能大部分沒用
*上,所以這個時候freeMemory()可 能會有些大。

*   注: JAVA_OPTS='-Xms【初始化內存大小】 -Xmx【可以使用的最大內存】' set JAVA_OPTS=-Xms1024m -Xmx2048m  設的大點
*/

 // 手動調用GC

System.gc() ;  


//free和use和total均爲KB  
  long free=0;  
  long use=0;  
  long total=0;  
  int kb=1024;  
  Runtime rt=Runtime.getRuntime();  
  total=rt.totalMemory();  
  free=rt.freeMemory();
  use=total-free;  
  System.out.println("系統內存已用的空間爲:"+use/kb+" MB");  
  System.out.println("系統內存的空閒空間爲:"+free/kb+" MB");  
  System.out.println("系統總內存空間爲:"+total/kb+" MB");   

  // 用於操作系統的管理接口,Java 虛擬機在此操作系統上運行。 
  OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();  
  long physicalFree=osmxb.getFreePhysicalMemorySize()/kb;  
  long physicalTotal=osmxb.getTotalPhysicalMemorySize()/kb;  
  long physicalUse=physicalTotal-physicalFree;  
  String os=System.getProperty("os.name");  
  System.out.println("操作系統的版本:"+os);  
  System.out.println("系統物理內存已用的空間爲:"+physicalFree+" MB");  
  System.out.println("系統物理內存的空閒空間爲:"+physicalUse+" MB");  
  System.out.println("總物理內存:"+physicalTotal+" MB");        
  // 獲得線程總數        
  ThreadGroup parentThread;       
  for (parentThread = Thread.currentThread().getThreadGroup(); parentThread.getParent() != null; parentThread = parentThread.getParent()){
   int totalThread = parentThread.activeCount();       
   System.out.println("獲得線程總數:"+totalThread);
  }




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章