A JVM doesn't convert your program to byte code, that's the job of a Java source code compiler like javac. The JVM takes bytecodes and executes them. That execution might be through simple interpretation or by converting direct to native code. The JVM also provides all the native implementation for API's that require platform specific execution - such as working with the file system, doing graphics, network I/O etc etc.