I used to think the JVM is a layer on top hardware and executes platform-independent bytecode against the hardware. The hardware components include
- network ports
- CPU and memory
- kernel threads
- user input devices + screen
Consider assembly code. I guess assembly code deals directly with the same hardware components, with possible exception of threads.
(Not sure where the operating system kernel comes into play. See https://bintanvictor.wordpress.com/2011/09/08/what-is-kernel-space-vs-userland/)
Now I think JVM includes a JIT compiler that converts bytecode into assembly. See https://bintanvictor.wordpress.com/2016/02/09/javac-jit-2-compilers/