A JVM (Java Virtual Machine) is an imaginary (theoretical) machine that executes Java bytecodes.
A JRE (Java Runtime Environment) is a software implementation of a JVM and all the standard Java libraries, and other bits and pieces that are needed to make the thing actually work.
A JDK (Java Developer's Kit) or J2SDK (Java 2 Software Developer's Kit) are two different names for the same thing: a JRE plus tools like the Java compiler, debugger, and other things needed for basic Java development.
The diagram on this page visualizes it nicely: JDK and JRE are brackets on the left, while the JVM is the blue layer at the bottom.
Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.