RMI allows Java objects to invoke methods on remote Java objects located in another Java Virtual Machine. It handles marshaling parameters, transportation between client and server, and unmarshaling results. To create an RMI application, interfaces define remote services, servers implement interfaces and register with the RMI registry, and clients lookup services and invoke remote methods similarly to local calls. Stub and skeleton objects handle communication between remote VMs.