Technically, the term "JVM" specifies the Java Virtual Machine
. I.e., the "JVM" is the definition of the abstract, stack-based computational engine used to execute Java bytecodes. The term "JRE" stands for the Java Runtime Environment
(if you follow Sun's nomeclature) or, interchangeably, Java Runtime Engine
. I.e., a JRE is a specific implementation of the the JVM, including the core libaries.
Alas, in practice, many people use "JVM" for both cases.
So, be careful to understand the context that people are talking about when using the term "JVM" to distinguish between the abstract definition and a specific implementation.