javaboy2006 发表于 2013-2-7 18:31:48

计算java对象大小

/** ** http://hi.baidu.com/whzkinger/blog/item/84e82b01295a500d7bec2c0e.html **/public class TestSizeOf {    private static final Runtime s_runtime = Runtime.getRuntime();    public static void main(String[] args) throws Exception {      // Warm up all classes/methods we will use      runGC();      usedMemory();      // Array to keep strong references to allocated objects      final int count = 100000;      Object[] objects = new Object;      long heap1 = 0;      // Allocate count+1 objects, discard the first one      for (int i = -1; i < count; ++i) {            Object object = null;            // Instantiate your data here and assign it to object            object = new Object();            //object = new Integer (i);            //object = new Long (i);            //object = new String ();            //object = new byte ;            if (i >= 0) {                objects = object;            } else {                object = null; // Discard the warm up object                runGC();                heap1 = usedMemory(); // Take a before heap snapshot            }      }      runGC();      long heap2 = usedMemory(); // Take an after heap snapshot:      final int size = Math.round(((float) (heap2 - heap1)) / count);      System.out.print("after heap(" + heap2 + ")-before heap(" + heap1 + ")=" + (heap2 - heap1)                         + "\nclassName=" + objects.getClass().getName() + "\nsize=" + size                         + " bytes");      for (int i = 0; i < count; ++i) {            objects = null;      }      objects = null;    }    private static void runGC() throws Exception {      // It helps to call Runtime.gc()      // using several method calls:      for (int r = 0; r < 4; ++r) {            _runGC();      }    }    private static void _runGC() throws Exception {      long usedMem1 = usedMemory();      long usedMem2 = Long.MAX_VALUE;      for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) {            s_runtime.runFinalization();            s_runtime.gc();            Thread.currentThread().yield();            usedMem2 = usedMem1;            usedMem1 = usedMemory();      }    }    private static long usedMemory() {      return s_runtime.totalMemory() - s_runtime.freeMemory();    }}
页: [1]
查看完整版本: 计算java对象大小