Para responder ao seu primeiro conjunto de perguntas, eu diria que a declaração do seu amigo é imprecisa na melhor das hipóteses. Você pode ter um aplicativo igualmente mal executado em hardware direto; Eu infelizmente sei disso como um fato (aplicativo do fornecedor mal desenvolvido em hardware grande - ainda tem um desempenho ruim). Isso realmente se resume a dois itens principais:
- Quão bem o aplicativo foi escrito
- Quão bem a JVM está ajustada para executar o aplicativo
Eu executei aplicativos bem comportados e aplicativos Java mal escritos. Por outro lado, também encontrei o mesmo com outros frameworks como PHP e Perl.
Isso não quer dizer que um ambiente virtualizado seja completamente inocente aqui. Você precisa entender os requisitos do seu aplicativo e dimensionar sua (s) máquina (s) virtual (s) de acordo. Muitas pessoas querem "barato" e obter a menor configuração de VM e, em seguida, se perguntam por que seu aplicativo está trocando como louco ou lançando exceções OutOfMemory.