RMI allows objects in one Java virtual machine to invoke methods on objects residing in another JVM. It uses distributed objects, where a client proxy marshals method invocations into messages and unmarshals reply messages. A server skeleton unmarshals invocations and forwards replies. RMI supports both static and dynamic invocation. Examples of RMI include DCE remote objects, which extend RPCs to support remote method invocation, and Java RMI, which integrates distributed objects into Java for high distribution transparency.