In virtualization, a virtual machine (or VM for short) is something that pretends to be an entire machine but really exists only in the imagination of the hypervisor. It has all the facilities of a real machine but there is no physical box associated with it. A single physical machine can be virtualized to create several virtual machines.
In interpreted languages, such as Java bytecode, virtual machine refers to the made-up InstructionSetArchitecture presented by the environment. The Java Virtual Machine is a stack-based ISA with knowledge of objects and number types, and Java applications are compiled to run on this architecture.
When talking about Xen, we often refer to a domain as a virtual machine. It shares the qualities of both of the definitions given above. Like in a fully virtualized system, it is an environment presented to operating systems where they would normally expect to see a real machine. Unlike in a fully virtualized system, it does not have all the facilities of a real machine: Xen provides alternatives to some of the machine's capabilities instead of emulating them. As in the second definition, Xen is a made-up InstructionSetArchitecture. Although it is very similar to the native machine (i.e. Xen x86 has all of the user-mode features of native x86, and most of the kernel-mode features as well), it is not exactly the same, so operating systems that wish to be run under Xen have to have their kernels ported to its architecture. This is a small cost, but it provides great performance gains over fully-virtualized systems.
Current developments in hardware support for virtualization mean that it will soon be possible to also run native OSes on Xen without modification.