ConcurrentHashMap memory overhead

Maxime picture Maxime · Jun 19, 2012 · Viewed 7.2k times · Source

Does somebody know what is the memory overhead of a ConcurrentHashMap (compared to a "classical" HashMap) ?

  • At construction ?
  • At insertion of an element ?

Answer

Peter Lawrey picture Peter Lawrey · Jun 19, 2012

If you run the following with -XX:-UseTLAB -XX:NewSize=900m -mx1g on a 64-bit JVM.

public static void main(String... args) throws NoSuchMethodException, IllegalAccessException {
    for (int i = 0; i < 4; i++) {
        long used1 = usedMemory();
        populate(new HashMap());
        long used2 = usedMemory();
        populate(new ConcurrentHashMap());
        long used3 = usedMemory();
        System.out.println("The ratio of used memory is " + (double) (used3 - used2) / (used2 - used1));
        System.out.println("For an extra " + ((used3 - used2) - (used2 - used1)) / 1000000 + " bytes per entry was used.");
    }
}

private static void populate(Map map) {
    for (Integer i = 0; i < 1000000; i++)
        map.put(i, i);
}

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

you get with Java 6 and 7 for one million entries.

The ratio of used memory is 1.1291128466982379
For an extra 8 bytes per entry was used.
The ratio of used memory is 1.1292086928728067
For an extra 8 bytes per entry was used.
The ratio of used memory is 1.1292086928728067
For an extra 8 bytes per entry was used.
The ratio of used memory is 1.1292086928728067
For an extra 8 bytes per entry was used.

Eight MB of memory costs around 5 cents.