Transparent Migration of Java-Based Mobile Agents: Capturing and Reestablishing the State of Java Programs