JVM allows Java portability to execute within platform and hardware-independent applications. It's a big part of the "write once, run anywhere (WORA)" philosophy.
The JVM is actually part of the Java Runtime Environment (JRE). It is the JRE (JVM plus base classes) that enables Java bytecode to run on any platform.
Bytecodes, which are interpreted by the JVM, simply call classes found in the JRE when they need to perform actions they cannot do by themselves. Some actions, like those directed to the underlying hardware or the operating system, are performed by the JVM. Bytecodes lack functionality by themselves and need the JVM to do many tasks for them.This perceived limitation is actually an advantage. First, it allows Java programs to be very small compared to other executable programs. Second, and more importantly, it allows them to be very portable.
Since each JVM is tailor-made for a specific platform, a Java program cannot run on it unless: (1) An appropriate JVM has been created for it, and; (2) That JVM has been installed on it. The portability of Java programs are therefore fully dependent on the presence of a specific JVM.
Communication between an application and each underlying platform can be very sophisticated, but the JVM handles it well by providing a layer of abstraction between the two. As such, developers do not need to be aware of the intricacies involved for each application-platform pair.