简体   繁体   中英

Java: Size of a Vector in bytes

Is it possible to get the size of the Vector or ArrayList or any object for that matter in bytes in java? size() function gives only the number of elements. But I want to get the actual size of the object.

For the time being, I implemented my own for getting size.

long sizeof(ArrayList<String> list)
{
    long size = 0;
    for(String s: list)
        size+=s.length();
    return size;
}

Different JDK having different size for the implicite objects.

You can count it by implicite object size multiply the length of the vector or arraylist. For Example if you declare a araylist of integer with 10 records in it, then Java integers are 32 bits ie 32/8 = 4 bytes. You have 10 records hence 10x4 = 40 byetes.

in standard java byte = 8 bits, short=16bits, int=32bits, long=64bits.

First : try to read Does Java have an operator like "sizeof()" in C

Second : Try this code :

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 [128][3]

            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

This is supposed to show memory usage

Runtime rt = Runtime.getRuntime();
long m0 = rt.totalMemory() -  rt.freeMemory();
Object obj = new Object();      // create your object here
long m1 = rt.totalMemory() -  rt.freeMemory();
System.out.println(m1 - m0);

but it does not work. This works (at least on my PC)

public static void main(String[] args) throws Exception {
    Object obj = createObject();
    long m0 = usedMem();
    long m1 = usedMem();
    obj = null;
    for (int i = 0; i < 100; i++)
        System.gc();
    m0 = usedMem();
    obj = createObject();
    for (int i = 0; i < 100; i++)
        System.gc();
    m1 = usedMem();
    System.out.println(m1 - m0);
}

private static long usedMem() {
    return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}

private static Object createObject() {
    return new Object();
}

if it prints 8 for new Object and 40 for new String() then it works correctly, then create your object and see its size

See more here http://www.javaspecialists.eu/archive/Issue029.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM