Este não é um problema do Linux, é um problema de Java (e comportamento completamente normal). O mesmo acontecerá no Windows, embora eu possa estar mais ansioso em trocar parte desses processos do Tomcat.
Primeiro, duas instâncias do Tomcat vão iniciar duas instâncias da JVM em dois processos separados. A questão é se você realmente precisa de duas instâncias do Tomcat. Você pode facilmente executar dois webapps diferentes na mesma instância.
Em segundo lugar, Java como uma linguagem baseada na coleção garbace gosta de ter muita memória para jogar e tende a usar uma grande porcentagem do heap máximo que é permitido usar, porque dessa forma faz menos trabalho geral na coleta de lixo . Também não costuma devolver a memória não utilizada ao SO, porque pode ser necessário em breve.Se tiver certeza de que seus aplicativos da Web precisam de menos de metade de uma memória de gigabyte, você poderá iniciar o Tomcat com um heap máximo menor definindo a variável de ambiente CATALINA_OPTS como "-Xmx256m" em catalina.sh para obter um máximo de heap 256MB. Se, às vezes, seu aplicativo precisar de mais memória, mas você quiser que ele diminua mais rapidamente, configure-o para "-XX: MaxHeapFreeRatio = 20 -XX: MinHeapFreeRatio = 10" - isso devolverá memória ao SO se mais de 20% do heap é livre após a coleta de lixo e expanda o heap se menos de 10% estiver livre. Mas isso pode reduzir o desempenho fazendo com que o Java gaste muito tempo alocando memória do sistema operacional e liberando-o novamente logo após.