¿Por qué hay diferencia en las estadísticas mostradas por Unix y Java RunTime?

Tengo algunos problemas de memoria con mi aplicación y necesito ayuda para comprender estas estadísticas.

Unix 'top' muestra estas estadísticas para mi proceso.

VSZ: 37.4g
RSS: 20.0g 

Entonces, esto significa que 20g se intercambian actualmente para el proceso y en uso.

Sin embargo, cuando imprimo estadísticas desde mi aplicación usando la clase Runtime, obtengo esto:

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

¿Por qué [Runtime.totalMemory () - Runtime.freeMemory ()] no coincide con RSS? Esta es la memoria actualmente en uso por el proceso. Hay una gran diferencia entre los dos números.

Además, ¿el tiempo de ejecución devuelve la memoria no utilizada (Runtime.freeMemory ()) al sistema operativo para que otros procesos la utilicen?

Tenga en cuenta que mis aplicaciones se ejecutan en un sistema de almacenamiento en caché GemFire de igual a igual configurado con cachés compartidos y replicados. Necesito optimizar la aplicación para reducir la huella de memoria.

Respuestas a la pregunta(1)

Su respuesta a la pregunta