O problema aqui não é realmente o tomcat, é o java em geral. Há vários lugares diferentes em que o java usa memória. O java runtime usa sua própria memória e isso será incluído no seu número; além disso, o java divide a memória em quatro locais distintos:
The Heap: This is the memory used to store your objects and is controlled by the
-Xms
and-Xmx
parameters.The Stack: This is the memory used to store the stack frames for the threads that your program maintains and can be controlled with the
-Xss
parameter.Permgen Memory: This is the memory used to store your compiled classes and pooled strings as well as some other things and can usually be controlled with
-XX:MaxPermSize
although the-XX
represents a debugging parameter, so there's no guarantee it's on all JVM's. But, the default Sun/Oracle reference implementations have always had them.JNI Allocated Memory Any classes utilizing native methods and JNI could potentially allocate unlimited memory. This memory comes from the OS and not the heap and there's no way of knowing how much memory a native class will use without having access to the source.
Uma visão geral do modelo de memória java provavelmente está além do escopo da resposta a essa pergunta e eu não consegui encontrar um artigo / descrição bem conciso na internet, mas a resposta curta para sua pergunta é se você está tentando limitar a quantidade absoluta de memória usada por um programa java, não há maneira fácil de fazê-lo. Heuristicamente, provavelmente reduza os parâmetros -Xms
e -Xmx
para 128m e você deve se aproximar, mas isso vai depender da sua aplicação.