1

在研究这个问题时:Java:RMI 目标对象的垃圾收集?我看到第一次调用时触发了完整的 GC:

UnicastRemoteObject.exportObject(new Remote(){}, 0);

我运行了一个包含上述调用的非常简单的程序,并设置了 -verbose:gc,并且始终看到触发了完整的 GC,例如[Full GC 1070K->184K(47552K), 0.0070096 secs]

我通过 Eclipse、命令行以及虚拟机和物理机运行它。我正在使用 Sun jdk 和热点 1.6。

有没有人观察到类似的行为?可能是什么原因?

4

2 回答 2

1

有一个后台线程检查 GC 是否已在 java.rmi.dgc.leaseValue 中运行,默认为一小时。

如果在任何 GC 运行之前启用此功能,我怀疑它会看到自上次 GC 以来的时间太长并触发完整的 gc。

执行此操作的类是sun.misc.GC

于 2012-10-09T07:50:50.977 回答
0

是的,我认为,它会触发 Full GC。

RMI 系统使用的分布式垃圾收集算法是一种引用计数算法。当客户端第一次收到对远程对象的引用时,会向导出该对象的服务器发送“引用”消息。客户端本地计算机中的每个后续引用都会导致引用计数器递增。随着本地引用的最终确定,引用计数会减少,一旦计数变为零,就会向服务器发送“未引用”消息。一旦服务器不再有对对象的实时引用并且没有本地引用,它就可以自由地完成并进行垃圾收集。

另请参阅下面的链接,了解默认 GC 间隔延长至一小时 (6200091)部分

http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/relnotes.html

于 2012-10-09T07:46:45.237 回答