natuurlijk hoef je niet te compileren tegen libraries
Het is java, het draait in een virtuele machine
System libraries zijn óók libraries.
Je compileert dus eigenlijk
altijd tegen libraries, tenzij je zelf de noodzakelijke functionaliteiten in al je apps bouwt, maar dat is 'reinventing Java all over again'...
En als je een complexere app bouwt (neem een Java game of enterprise applicatie) dan kom je al snel tot het gebruik van functionaliteit die niet, of niet eenvoudig, in de standaard Java-libraries te vinden is. Of die veel specifieker is dan wat er wordt meegeleverd.
Hiervoor zijn meestal wel third party libraries te vinden, maar ook hiertegen zal moeten worden gecompileerd. (Bijv. Apache Commons Logging)
Dezelfde app in java geschreven waar niks aan veranderd is kan dus meteen op een 64 bit vm direct 10GB aan memory gebruiken. Geen enkel probleem
Zolang er platform independant libraries worden gebruikt is het inderdaad geen enkel probleem. Zodra er echter voor een specifiek platform wordt gecompileerd (of externe libraries via JNI worden gebruikt) is het wel zaak om het goed in de gaten te houden.
32-bit libraries zullen waarschijnlijk in een soort '32-bit emulatiemodus' draaien (zoals WOW64 doet voor 32-bit applicaites op 64-bit Windows), waarbij onder de motorkap function calls en geheugenallocaties worden vertaalt zodat de VM er mee kan werken.
32-bit externe libraries (bijvoorbeeld Windows DLL's) zullen vaak gaan klagen als ze worden gebruikt in een 64-bit VM, waardoor je app waarschijnlijk niet start of flink crasht.
Ook de overhead van een GC.... Hoe je ook compileerd naar native toe , de GC blijf je houden.. Dat is nu eenmaal inherent aan java apps. Dus ja de GC heb je niet als je puur C++ doet maar ja dan heb je veel buggier code als je even niet oplet.
Dat zeg ik...

Al is geheugengebruik (en vooral memory leaks) een groter probleem dan 'buggy code'. Die heb je in iedere taal als je niet oplet.
En nee, een native geschreven app, compileren 1 keer naar een cpu/hardware waar jij nog net op wilt draaien. Daarna release je dat en dat is het dan.
Maar nu komt intel met een nieuwe cpu, bv met nieuwe AVX instructies, jouw native gecompileerde app gaat niet maar zo die instructies gebruiken. Voor een Java programma die op hotspot executeert hoeft alleen hotspot even aangepast worden (dus een nieuwe java versie) en alle java apps geschreven en gereleased jaren terug gebruiken meteen die nieuwe AVX instructies..
Zover ik weet is het vertalen van system calls naar 'cpu calls' een taak van het OS, en niet van de VM of applicatie zelf...
Ik kan er naast zitten, maar zover ik weet wordt er onder water gewoon gebruik gemaakt van de OS-specifieke API's, zowel in bijv. HotSpot als voor je willekeurige C++ applicatie.
Het omzetten van de calls is, volgens mij, de taak van de HAL (Hardware Abstraction Layer).
De compiler compileert vervolgens wel tegen een specifieke versie van de API van een bepaald platform (Linux, OS X, Windows), maar zolang daar niks in veranderd hoeft er in je applicatie ook niets te veranderen.
En nieuwe instructiesets worden ook in C++ applicaties opgepakt zodra het OS ze ondersteunt. Daar zijn de API's voor.