我有一个很奇怪的问题。
我正在基于Eclipse Equinox的OSGi应用程序上工作;它是使用OSGi Log Service(Equinox实现)开发的,现在我正在使用Apache Felix OSGi Log Service实现对其进行测试。

在API/代码方面,一切正常:OSGi日志服务是标准的,因此我可以毫无疑问地从Equinox切换到Felix。

但是,我观察到了这种奇怪的行为:我以控制台程序的形式启动了该应用程序,以查看控制台上的日志输出,并且将其附加到JVisualVM上以分析内存使用情况。 JVisualVM图显示了80 MB的已用堆。

13小时后,平均堆大小达到220 MB,因此我决定分析堆转储,然后按下“堆转储”按钮:此操作后,JVisualVM图形显示已用堆为20(min)-35 (max)MBs(?!?!),并且此值是恒定的。

“堆转储”操作能否释放将近200 mbs?如果是,为什么?

我从未在Equinox OSGi Log Service实现中看到此行为,因此我怀疑Felix Log涉及此问题...

谢谢

最佳答案



是的,它可以。我还没有研究代码,但是我很确定它调用HotSpotDiagnosticMXBean.dumpHeap并将第二个参数设置为true(如果您使用jconsole或JVisualVM的MBeans扩展名将其称为默认值)。以我的经验,这样做会在转储堆之前触发一个显式的gc,这可能是“为什么?”的答案。

10-08 16:09