While the JVM, being a virtual machine, is a software construct, it's a model (or emulation) of a real piece of hardware.
With this in mind, it's interesting to note that J(v)M has an entirely stack based architecture. There are no registers available to the programmer.(This means that all operations have to access memory) This is very much contrary to the present trends in CPU design, where everyone's adding more registers.
Now, if Java were originally concieved of as the internet/universal platform it's generally viewed as, the idea of basing everything on the stack model would make sense. Minimizing the number of registers used would allow a simple and fast implimentation, regardless of the number of available on the host platform.
However, Java was originally intended to be used for embedded applications. Looked at in this light, it was a way of getting the simplicity and cost reduction of a RISC design, without the cost and trouble of adding all those registers. (see cop out)