六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 60|回复: 0

计算java对象大小

[复制链接]

升级  32.67%

25

主题

25

主题

25

主题

秀才

Rank: 2

积分
99
 楼主| 发表于 2013-2-7 18:31:48 | 显示全部楼层 |阅读模式
/** *  * 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[count];        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 [128][1];            if (i >= 0) {                objects[i] = 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[0].getClass().getName() + "\nsize=" + size                         + " bytes");        for (int i = 0; i < count; ++i) {            objects[i] = 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();    }}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表