在研究这个问题的同时:Java: garbage collection for RMI target object?我看到第一次拨打电话时会触发完整的GC:
UnicastRemoteObject.exportObject(new Remote(){}, 0);
我运行了一个包含上述调用的非常简单的程序,使用-verbose:gc set,并且始终看到已触发完整的GC,例如[Full GC 1070K->184K(47552K), 0.0070096 secs]
我通过Eclipse,命令行以及虚拟机和物理机运行它。我正在使用Sun jdk和hotspot 1.6。
是否有人观察到类似的行为?可能是什么原因?
答案 0 :(得分:1)
有一个后台线程检查GC是否已在java.rmi.dgc.leaseValue中运行,默认为一小时。
如果在任何GC运行之前启用此功能,我怀疑它会看到自上一次GC过长以来的这段时间并触发一个完整的gc。
执行此操作的班级是sun.misc.GC
答案 1 :(得分:0)
是的,我认为,它会触发Full GC。
RMI系统使用的分布式垃圾收集算法是一种引用计数算法。当客户端首次收到对远程对象的引用时,引用"引用"消息将发送到导出对象的服务器。客户端本地机器中的每个后续引用都会使引用计数器递增。当最终确定本地参考时,参考计数递减,并且一旦计数变为零,则“未参考”#&消息被发送到服务器。一旦服务器没有对象的实时引用并且没有本地引用,就可以自由地完成并垃圾收集。
另请参阅以下链接默认GC间隔时间延长至一小时(6200091)部分
http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/relnotes.html