您的位置:首页 > 编程语言 > Java开发

查看java对象占堆内存多少个字节

2016-05-03 15:56 513 查看
abstract class SizeOf {     

    

    private final Runtime s_runtime = Runtime.getRuntime();     

    

    /**   

     *   

     * 子类负责覆盖该方法以提供被测试类的实例   

     *   

     * @return 被测试类的实例   

     */    

    protected abstract Object newInstance();     

    

    /**   

     *   

     * 计算实例的大小(字节数)   

     *   

     * @return 实例所占内存的字节数   

     * @throws Exception   

     */    

    public int size() throws Exception {     

    

        // 垃圾回收     

        runGC();     

    

        // 提供尽可能多(10万)的实例以使计算结果更精确     

        final int count = 100000;     

        Object[] objects = new Object[count];     

    

        // 实例化前堆已使用大小     

        long heap1 = usedMemory();     

        // 多实例化一个对象     

        for (int i = -1; i < count; ++i) {     

            Object object = null;     

    

            // 实例化对象     

            object = newInstance();     

    

            if (i >= 0) {     

                objects[i] = object;     

            } else {     

                // 释放第一个对象     

                object = null;     

                // 垃圾收集     

                runGC();     

                // 实例化之前堆已使用大小     

                heap1 = usedMemory();     

            }     

        }     

    

        runGC();     

        // 实例化之后堆已使用大小     

        long heap2 = usedMemory();     

        final int size = Math.round(((float) (heap2 - heap1)) / count);     

    

        // 释放内存     

        for (int i = 0; i < count; ++i) {     

            objects[i] = null;     

        }     

        objects = null;     

        return size;     

    }     

    

    private void runGC() throws Exception {     

        // 执行多次以使内存收集更有效     

        for (int r = 0; r < 4; ++r) {     

            _runGC();     

        }     

    }     

    

    private 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();     

        }     

    }     

    

    /**   

     *   

     * 堆中已使用内存   

     *   

     * @return 堆中已使用内存   

     */    

    private long usedMemory() {     

        return s_runtime.totalMemory() - s_runtime.freeMemory();     

    }     

}    

class Person{

int num;
static
long l;

}

public class Test extends SizeOf {  

  

    @Override  

    protected Object newInstance() {  

        return new Person();  

    }  

  

    public static void main(String[] args) throws Exception {  

        SizeOf sizeOf = new Test();  

        System.out.println("所占堆内存:" + sizeOf.size() + "字节");  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: