To answer your first set of questions, I would say that your friend's statement is inaccurate at best. You can have an equally poorly running application on straight up hardware; I unfortunately know this as a fact (Badly developed vendor app on large hardware -- still performs poorly). It really boils down to two major items:
- How well the application was written
- How well the JVM is tuned to run said application
I have run both well behaved applications and poorly written Java applications. Conversely, I have also come across the same with other frameworks like PHP and Perl.
This isn't to say a virtualized environment is completely blameless here. You have to understand the requirements of your application and size your virtual machine(s) accordingly. Many people want to "cheap it out" and get the smallest VM configuration and then wonder why their application is either swapping like mad or throwing OutOfMemory exceptions.