[英]Java: a full GC when UnicastRemoteObject.exportObject() is called?
在研究此问题时: Java:RMI目标对象的垃圾回收? 我看到第一次调用此函数会触发完整的GC:
UnicastRemoteObject.exportObject(new Remote(){}, 0);
我运行了一个非常简单的程序,其中包含设置了-verbose:gc的上述调用,并始终看到触发了完整的GC,例如[Full GC 1070K->184K(47552K), 0.0070096 secs]
我在命令行,虚拟机和物理机上都通过Eclipse运行了它。 我正在使用Sun JDK和Hotspot 1.6。
有没有人观察到类似的行为? 可能是什么原因造成的?
有一个后台线程可以检查GC是否已在java.rmi.dgc.leaseValue中运行,默认情况下为一小时。
如果在运行任何GC之前启用了此功能,那么我怀疑自上次GC以来此时间将过长并触发完整的gc。
执行此操作的类是sun.misc.GC
是的,我认为,它会触发Full GC。
RMI系统使用的分布式垃圾收集算法是引用计数算法。 当客户端首先收到对远程对象的引用时,“引用”消息将发送到正在导出对象的服务器。 客户端本地计算机中的每个后续引用都会导致引用计数器增加。 最终确定本地引用后,引用计数将减少,并且一旦计数变为零,就会向服务器发送“未引用”消息。 一旦服务器不再有对对象的实时引用并且没有本地引用,就可以自由地对其进行终结和垃圾回收。
另请参见下面的链接, 以获取长达一小时的默认GC间隔(6200091)部分
http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/relnotes.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.