跟你建立的那个对象有关呀,有些对象占的内存就少,有些就大。不过你不用考虑,如果要用的话,大也得用呀。我看一本著名人书上写着最好的优化就是不优化,那样反而会出现更多的bug:(
java2参考大全第五版挺好的,看一看吧

解决方案 »

  1.   

    新建一个对象时,在栈里占4byte的空间(引用),在堆里保存实际对象给你一个程序,可以自己看看对象所占内存
    public class SizeOf{
        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 [4][2];
                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.println ("'before' heap: " + heap1 +
                                ", 'after' heap: " + heap2);
            System.out.println ("heap delta: " + (heap2 - heap1) +
                ", {" + objects [0].getClass () + "} size = " + 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 (), 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 ();
        }
        private static final Runtime s_runtime = Runtime.getRuntime ();
    } // End of class   
      

  2.   

    Hodex(小何才露尖尖角) :有些看不懂,有解释一下吗?
      

  3.   

    JVM初始化时根据对象的定义分配相应的内存空间,然后做值初始化。其中内容空间的大小跟对象的定义有关系,对象包含的变量、Object越多,占用空间就越大。
      

  4.   

    反正那个程序就是创建对象前记一下当时剩余内存heap1,创建后再记一下当前内存heap2
    注意for是创建了100000个对象,然后(heap1-heap2)/100000,即为一个对象所用内存