RMI allows objects running on one Java Virtual Machine (JVM) to access objects running on another JVM, enabling the building of distributed applications. An RMI application has a client program that requests remote objects on a server program. The server program creates remote objects and makes their references available to clients. When a client invokes a method on a remote object, the request is passed through stubs and skeletons to the actual object on the server. The response then passes back to the client through the same path. The RMI registry allows clients to lookup remote objects by name.