天天看點

java 檢視記憶體占用大小

Java程式計算各種對象所占記憶體的大小的方法。 

基類: 

Java代碼  ​

java 檢視記憶體占用大小
​​

  1. public abstract class SizeOf {  
  2.     private final Runtime s_runtime = Runtime.getRuntime();  
  3.     /** 
  4.      * 
  5.      * 子類負責覆寫該方法以提供被測試類的執行個體 
  6.      * @return 被測試類的執行個體 
  7.      */  
  8.     protected abstract Object newInstance();  
  9.      * 計算執行個體的大小(位元組數) 
  10.      * @return 執行個體所占記憶體的位元組數 
  11.      * @throws Exception 
  12.     public int size() throws Exception {  
  13.         // 垃圾回收  
  14.         runGC();  
  15.         // 提供盡可能多(10萬)的執行個體以使計算結果更精确  
  16.         final int count = 100000;  
  17.         Object[] objects = new Object[count];  
  18.         // 執行個體化前堆已使用大小  
  19.         long heap1 = usedMemory();  
  20.         // 多執行個體化一個對象  
  21.         for (int i = -1; i < count; ++i) {  
  22.             Object object = null;  
  23.             // 執行個體化對象  
  24.             object = newInstance();  
  25.             if (i >= 0) {  
  26.                 objects[i] = object;  
  27.             } else {  
  28.                 // 釋放第一個對象  
  29.                 object = null;  
  30.                 // 垃圾收集  
  31.                 runGC();  
  32.                 // 執行個體化之前堆已使用大小  
  33.                 heap1 = usedMemory();  
  34.             }  
  35.         }  
  36.         // 執行個體化之後堆已使用大小  
  37.         long heap2 = usedMemory();  
  38.         final int size = Math.round(((float) (heap2 - heap1)) / count);  
  39.         // 釋放記憶體  
  40.         for (int i = 0; i < count; ++i) {  
  41.             objects[i] = null;  
  42.         objects = null;  
  43.         return size;  
  44.     }  
  45.     private void runGC() throws Exception {  
  46.         // 執行多次以使記憶體收集更有效  
  47.         for (int r = 0; r < 4; ++r) {  
  48.             _runGC();  
  49.     private void _runGC() throws Exception {  
  50.         long usedMem1 = usedMemory();  
  51.         long usedMem2 = Long.MAX_VALUE;  
  52.         for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) {  
  53.             s_runtime.runFinalization();  
  54.             s_runtime.gc();  
  55.             Thread.currentThread().yield();  
  56.             usedMem2 = usedMem1;  
  57.             usedMem1 = usedMemory();  
  58.      * 堆中已使用記憶體 
  59.      * @return 堆中已使用記憶體 
  60.     private long usedMemory() {  
  61.         return s_runtime.totalMemory() - s_runtime.freeMemory();  
  62. }  

子類: 

java 檢視記憶體占用大小
  1. public class SizeOfObject extends SizeOf {  
  2.     @Override  
  3.     protected Object newInstance() {  
  4.         return new Object();  
  5.     public static void main(String[] args) throws Exception {  
  6.         SizeOf sizeOf = new SizeOfObject();  
  7.         System.out.println("所占記憶體:" + sizeOf.size() + "位元組");  

輸出為:所占記憶體:8位元組 

利用序列化(Serializable)計算對象的大小 

下面代碼可以計算session的大小: 

将session中的所有對象輸出到檔案中,檔案的大小就是對象的大小. 

java 檢視記憶體占用大小
  1. try {  
  2.     FileOutputStream f = new FileOutputStream("c:/sessionFiles");  
  3.     ObjectOutputStream s = new ObjectOutputStream(f);  
  4.     s.writeObject("session:");  
  5.     HttpSession session = request.getSession(false);  
  6.     Enumeration names = session.getAttributeNames();  
  7.     while(names.hasMoreElements()){  
  8.         s.writeObject(session.getAttribute((String) names.nextElement()));  
  9.     s.flush();  
  10.     s.close();  
  11.     f.close();  
  12. } catch (Exception e) {  
  13.     e.printStackTrace();  

也可以看看這個 

java對象占記憶體大小