In my Java code, I am using Guava’s Multimap (com.google.common.collect.Multimap) by using this:
Multimap<Integer, Integer> Index = HashMultimap.create()
Here, Multimap key is some portion of a URL and value is another portion of the URL (converted into an integer). Now, I assign my JVM 2560 Mb (2.5 GB) heap space (by using Xmx and Xms). However, it can only store 9 millions of such (key,value) pairs of integers (approx 10 million). But, theoretically (according to memory occupied by int) it should store more.
Can anybody help me,
- Why is
Multimapusing lots of memory? I checked my code and without inserting pairs into theMultimap, it only uses 1/2 MB of memory.
2.
Is there another way or home-baked solution to solve this memory issue? Means, Is there any way to reduce those object overheads as I want to store only int-int? In any other language ? Or any other solution (home-baked preferred) to solve issue I faced, means DB based or something like that solution.
There’s a huge amount of overhead associated with
Multimap. At a minimum:Integerobject, which (at a minimum) doubles the storage requirements of eachintvalue.HashMultimapis associated with aCollectionof values (according to the source, theCollectionis aHashset).Hashsetis created with default space for 8 values.So each key/value pair requires (at a minimum) perhaps an order of magnitude more space than you might expect for two
intvalues. (Somewhat less when multiple values are stored under a single key.) I would expect 10 million key/value pairs to take perhaps 400MB.Although you have 2.5GB of heap space, I wouldn’t be all that surprised if that’s not enough. The above estimate is, I think, on the low side. Plus, it only accounts for how much is needed to store the map once it is built. As the map grows, the table needs to be reallocated and rehashed, which temporarily at least doubles the amount of space used. Finally, all this assumes that
intvalues and object references require 4 bytes. If the JVM is using 64-bit addressing, the byte count probably doubles.