Supongo que una razón es que Java tiene que hacer todo por sí mismo (otro aspecto de la independencia de la plataforma). Por ejemplo, Swing dibuja sus propios componentes desde cero, no depende del sistema operativo para dibujarlos. Eso tiene que suceder en la memoria. Muchas de las cosas que windows pueden hacer, pero Linux no tiene (o tiene algo diferente) que estar contenido en Java para que funcione igual en ambos.
Java también siempre insiste en que toda la biblioteca está "Vinculada" y disponible. Como no usa archivos DLL (no estarían disponibles en todas las plataformas), todo tiene que ser cargado y rastreado por Java.
Java incluso hace mucho de su propio punto flotante ya que las FPU a menudo dan resultados diferentes que se han considerado inaceptables.
Así que si piensas en todo lo que C# puede delegar en el sistema operativo al que está vinculado vs todo lo que Java tiene que hacer para el sistema operativo para compensar a los demás, la diferencia debería esperarse.
Ahora he ejecutado aplicaciones Java en 2 plataformas integradas. Uno era un analizador de espectro en el que dibujaba las trazas, el otro era decodificadores de cable.
En ambos casos, esta huella mínima de memoria no ha sido un problema - HAN habido problemas específicos de Java, que simplemente no ha sido uno. La cantidad de objetos instanciados y la velocidad de pintura Swing fueron problemas mayores en estos casos.
¿Cómo sabes que está sobrecargado? ¿Hiciste un programa esqueleto en cada uno y los ejecutaste? Solo puedo conseguir que la JVM tome alrededor de 7 mb en el arranque (según el Administrador de tareas), incluso con -Xmx256m-Xms256m. –
¿Puede darnos una clase de prueba que utilizó en ambos? Esto ayudará a reproducir el problema y, por lo tanto, dar buenas respuestas. –
No creo que mi pregunta fuera clara, así que solo la edité. Para una clase de prueba, una simple aplicación HelloWorld. – jshen