I have a Map(String, String) and I want to find the memory size of an Entry and the Map in total. I read somewhere that Instrumentation might be useful (Instrumentation). Does anyone have an idea?
Thanks in advance.
I have a Map(String, String) and I want to find the memory size of an Entry and the Map in total. I read somewhere that Instrumentation might be useful (Instrumentation). Does anyone have an idea?
Thanks in advance.
 
    
     
    
    Use ObjectOutputStream to write the object to a ByteArrayOutputstream and check the length of the resultant byte array.
Obviously your Map.Entry will need to implement Serializable.
public int getSizeInBytes(Serializable someObject) {
    ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
    ObjectOutputStream objectOut = new ObjectOutputStream(byteOut);
    objectOut.writeObject(someObject);
    objectOut.flush();
    return byteOut.toByteArray().length;
}
public int getSizeBits(Serializable someObject) {
    return getSizeInBytes(someObject) * 8;
}
 
    
    A blank instance of java.util.AbstractMap.SimpleEntry should be 24 bytes for 64-bit JVM and 12 bytes for 32-bit JVM. Here is a technique by @PeterLawrey I found useful, based on MemoryUsageExamplesTest: 
System.out.printf("The average memory used by simple entry is %.1f bytes%n", new SizeofUtil() {
    @Override
    protected int create() {
        Map.Entry<String, String> e = new AbstractMap.SimpleEntry<String, String>(null, null);
        return 1;
    }
}.averageBytes());
