The JVM (Java Virtual Machine) is the engine that actually executes Java bytecode; there is a different JVM implementation per operating system, which is what makes Java portable.
The JRE (Java Runtime Environment) is the JVM plus the standard class libraries needed to RUN a Java application. The JDK (Java Development Kit) is the JRE plus the development tools you need to BUILD applications -- the compiler javac, the jar tool, javadoc, the debugger and so on. To write Java you install a JDK; to only run a finished app you historically needed just a JRE (modern distributions usually ship a full JDK).
- Saying the JRE and JDK are the same thing, or that you need the JDK only for 'big' projects.
- Forgetting that the JVM is platform-specific even though bytecode is not.