I am observing a mismatch in Tomcat RAM consumption between what the OS says and what jVisualVM says.
From htop, the Tomcat JVM is has 993 MB of resident memory
From jVisualVM, the Tomcat JVM is using
- Heap Max: 1,070,399,488 B
- Heap Size: 298.438.656 B
- Heap Used: variable, between 170MB and and 270MB
- PermGen Max: 268,435,456 B
- PermGen Size: 248,872,960 B
- PermGen Used: slightly variable, around 150MB
From my understanding the OS memory consumption should be Heap Size + PermGen Size ~= 522 MB. But that’s 471 MB less than what I’m observing.
Anyone got an idea what am I missing here?
PS: I know that my max heap is much higher than what is used, but I’m assuming that should have no effect if the JVM does not use it (i.e. Heap Size is lower).
Thanks!
Marc
If I understand the question what you are seeing is a combination of memory fragmentation and JVM memory overhead in other areas. We often see 2 times the memory usage for our production programs than we would expect to see from our memory settings.
Memory fragmentation can mean that although the JVM thinks that the OS has given it some number of bytes, there is a certain addition number of bytes that had to be given because of memory subsystem optimizations.
In terms of JVM overhead, there are a number of other storage areas that are not included in the standard memory configs. Here’s a good discussion about this. To quote: