天天看點

java 檢視記憶體占用大小

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

基類: 

java 檢視記憶體占用大小

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

            }  

        }  

        // 執行個體化之後堆已使用大小  

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

}  

子類: 

java 檢視記憶體占用大小

public class SizeOfObject extends SizeOf {  

    @Override  

    protected Object newInstance() {  

        return new Object();  

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

        SizeOf sizeOf = new SizeOfObject();  

        System.out.println("所占記憶體:" + sizeOf.size() + "位元組");  

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

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

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

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

java 檢視記憶體占用大小

try {  

    FileOutputStream f = new FileOutputStream("c:/sessionFiles");  

    ObjectOutputStream s = new ObjectOutputStream(f);  

    s.writeObject("session:");  

    HttpSession session = request.getSession(false);  

    Enumeration names = session.getAttributeNames();  

    while(names.hasMoreElements()){  

        s.writeObject(session.getAttribute((String) names.nextElement()));  

    s.flush();  

    s.close();  

    f.close();  

} catch (Exception e) {  

    e.printStackTrace();  

也可以看看這個 

java對象占記憶體大小