Virtual threads are lightweight threads in Java that do not correspond to native threads in the operating system, allowing for reduced memory usage as their stack frames are stored in heap memory. The Java Virtual Machine (JVM) manages these threads by scheduling their execution on a limited number of platform threads and handling blocking operations efficiently. New executor services like ThreadPerTaskExecutor facilitate easy management of virtual threads by creating a new virtual thread for each submitted task.