研究垃圾回收機制,計算對象創建佔用的內存


package tigers;

public class Tiger14 {

 public static void main(String[] args) {
  int[] timesArray = {10, 100, 1000, 10000};
  execute("java.lang.StringBuffer", timesArray);
  execute("java.lang.String", timesArray);
  execute("java.lang.Object", timesArray);
 } 
 private static void execute(String className, int[] timesArray) {
  try {
   System.out.println("<+>>>>>> Test: [" + className + "]");
   for (int i : timesArray) {
    long used = usedMemory(className, i);
    System.out.println(used + "(" + i + " times)");
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 private static long usedMemory(String className, int times) throws Exception{
  Class c = Class.forName(className);
  int size = times;
  Object[] obs = new Object[times];
//  runGC();
  rt.gc();
  long start = rt.freeMemory();
  for (int i = 0; i < size; i++) {
   obs[i] = c.newInstance();
  }
//  runGC();
  rt.gc();
  long end = rt.freeMemory();
  return (start - end) / size;
 }
 private static Runtime rt = Runtime.getRuntime();


 private static void runGC() throws Exception{ //試圖強制運行垃圾回收。
  long past = Long.MAX_VALUE, now = rt.freeMemory();
  for (int i = 0; (past > now) && (i < 500); i++) { //只有當垃圾回收確實執行以後,現在剩餘的內存纔會大於過去剩餘的內存,for循環纔會終止。
   rt.runFinalization(); //強制調用對象的finalize()方法,爲垃圾回收作準備。
   rt.gc(); //試圖激活垃圾回收線程。

   Thread.yield(); //延遲當前線程,使垃圾回收線程得到執行機會。
   past = now;
   now = rt.freeMemory(); //更新當前內存使用狀態
  }
 }
}

使用Runtime.gc()方法實現垃圾回收:

<+>>>>>> Test: [java.lang.StringBuffer]
112(10 times)
64(100 times)
64(1000 times)
63(10000 times)
<+>>>>>> Test: [java.lang.String]
184(10 times)
43(100 times)
40(1000 times)
35(10000 times)
<+>>>>>> Test: [java.lang.Object]
31(10 times)
14(100 times)
8(1000 times)
6(10000 times)
使用自定義的runGC()方法實現垃圾回收:

<+>>>>>> Test: [java.lang.StringBuffer]
-924(10 times)
61(100 times)
64(1000 times)
63(10000 times)
<+>>>>>> Test: [java.lang.String]
200(10 times)
38(100 times)
40(1000 times)
35(10000 times)
<+>>>>>> Test: [java.lang.Object]
47(10 times)
11(100 times)
6(1000 times)
8(10000 times)

發佈了75 篇原創文章 · 獲贊 3 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章