RMI allows Java objects to invoke methods on remote Java objects located in another JVM. It uses stubs and skeletons as proxies for remote objects. The client calls methods on the local stub which forwards the call to the remote skeleton which then calls methods on the actual remote object. Objects must implement the Remote interface and are registered with an RMI registry for lookup. The server implements the remote interface and registers objects with the registry, while the client looks up remote objects from the registry to invoke methods on them.