Да, но она же "кеширует" этот код. Поэтому исполняется по сути уже скомпилированный код, к тому же оптимизированный.
Потому что программа написана для работы на любой платформе. И не оптимизирована под конкретную. Например, можно было бы поменять параметры запуска, увеличить выделяемую память, использовать другой сборщик мусора, и прочее. Возможно, создатель этой программы вообще не думал о сборке мусора и не следил за утечками памяти. И полностью забил на любые оптимизации. Или ему нужно было быстро сдать проект
Вообще, на java лучше писать серверные приложения, а не клиентские. Именно там она покажет себя намного эффективнее с++. По скорости работы, портируемости, набору готовых решений, скорости разработки, и даже стабильности (не нужно следить за памятью, а в С++ любая ошибка приводит к краху).