por que há diferença nas estatísticas mostradas pelo unix e Java RunTime

Estou com alguns problemas de memória com meu aplicativo e preciso de ajuda para entender essas estatísticas.

O 'top' do Unix mostra essas estatísticas para o meu processo.

VSZ: 37.4g
RSS: 20.0g 

Portanto, isso significa que atualmente 20g são trocados pelo processo e em uso.

No entanto, quando imprimo estatísticas de dentro do meu aplicativo usando a classe Runtime, recebo o seguinte:

Runtime.totalMemory() : 9.8G
Runtime.freeMemory()  : 3.6G
Runtime.maxMemory()  : 14.3G

Por que [Runtime.totalMemory () - Runtime.freeMemory ()] corresponde ao RSS? Essa é a memória atualmente em uso pelo processo. Há uma enorme diferença entre os dois números.

Além disso, o tempo de execução devolve a memória não utilizada (Runtime.freeMemory ()) de volta ao SO para uso por outros processos?

Observe que meus aplicativos estão sendo executados em um sistema de cache GemFire ponto a ponto configurado com caches compartilhados e replicados. Preciso otimizar o aplicativo para reduzir o consumo de memória.

questionAnswers(1)

yourAnswerToTheQuestion