Я полагаю, одна из причин в том, что Java должна делать все сама (еще один аспект независимости платформы). Например, Swing рисует свои собственные компоненты с нуля, он не полагается на ОС для их рисования. Это все должно произойти в памяти. Windows может многое сделать, но linux не должен (или делает по-другому) полностью содержаться в Java, чтобы он работал одинаково на обоих.
Java также всегда настаивает на том, что вся ее библиотека «связана» и доступна. Поскольку он не использует библиотеки DLL (они не будут доступны на каждой платформе), все должно быть загружено и отслежено Java.
Java даже делает большую часть своей собственной плавающей запятой, поскольку FPU часто дают разные результаты, которые были сочтены неприемлемыми.
Так что, если вы думаете обо всем, что C # может делегировать ОС, с которой он связан, и обо всем, что Java должна делать для ОС, чтобы компенсировать другим, следует ожидать разницы.
Я запускаю Java-приложения на 2 встроенных платформах. Один был анализатором спектра, где он фактически рисовал следы, а другой - кабельные приставки.
В обоих случаях этот минимальный объем памяти не был проблемой - были проблемы, специфичные для Java, которых просто не было. Количество созданных объектов и скорость рисования Swing были большими проблемами в этих случаях.