Java Virtual Machine
It's called a virtual machine because it provides a layer of abstraction between Java application and the underlying physical machine and additionally has it's own instruction set.
Instruction Set
Like how CPU has it's own instruction set, JVM also has it's own instruction set and JVM knows then how to map these JVM specific instruction set to the underlying CPU specific instruction set.
When Java class is compiled, the .class file generated will have a certain format which only the JVM can parse and understand.
Always the first byte of the .class will have value 0XCAFEBABE which was just implemented to have a relation with coffee.
Stack Based Virtual Machine
It's called a stack based virtual machine since it uses a stack to manage the code execution. Stack frame is used to store state, local variables and also to control the execution flow. Read code execution for more details on how the stack is used for code execution.
Byte Code
It's called byte code because the Java code is converted into instructions which are length of a byte or more.
Dynamic resolution such as SPI, runtime provided classes, etc are possible due to the intermediate byte code compilation. If we compiled directly to native code, then such dynamic resolution and linking won't be possible.
Size of Byte Code
The conversion of plain Java code to byte code also ensures the size of the code is reduced. Even though Java code seem to be verbose, but the generated Byte code ensures that the size remains less by doing a lot of optimization and removing redundancies.
JVM itself is a native compiled code. This native code then translates Java's byte code to native code and schedules execution of that code.
Program Counter
Similar to instruction pointers in CPU, JVM also has a program counter which points to the byte code address from where the interpretation must start. This information is part of the stack frame used by interpreters to manage the execution flow. Whenever a method returns, the previous stack frame knows from where to continue using this.
Must read what's the byte code array in java here to understand how the program counter works.