Software component that executes an intermediate representation (bytecode, three-address code, etc.) rather than running directly on hardware. Enables running the same code on multiple platforms, supporting JIT compilation, garbage collection, and concurrency primitives. In Ruby, YARV is the reference VM; JRuby swaps it for the Java VM, TruffleRuby for GraalVM, etc. Ruby's Global VM Lock lives in the virtual machine.