在API /代码方面,一切正常:OSGi日志服务是标准的,所以我可以毫无问题地从Equinox交换到Felix。
但是,我观察到了这种奇怪的行为:我启动了应用程序作为控制台程序,在控制台上查看日志输出,并将其附加到JVisualVM以分析内存使用情况; JVisualVM图显示了一个80 MB的旧堆。
13个小时后,平均堆大小达到220 MB,所以我决定分析堆转储,并按下“堆转储”按钮:在此操作之后,JVisualVM图显示使用的堆为20(分钟)-35(最大)MB(?!?!),这个值是常数。
“堆转储”操作能否释放近200 mbs?如果是,为什么?
我从未在Equinox OSGi Log Service实现中看到这种行为,所以我怀疑Felix Log是否涉及此问题......
感谢
答案 0 :(得分:10)
“堆转储”操作能否释放近200 mbs?如果是,为什么?
是的,它可以。我没有研究过代码,但我很确定它调用HotSpotDiagnosticMXBean.dumpHeap并将第二个参数设置为true(如果你将其称为jconsole或JVisualVM的MBeans扩展,则它是默认值)。根据我的经验,这样做会在转储堆之前触发一个显式的gc,这可能就是“为什么?”的答案。
答案 1 :(得分:2)
为什么你甚至被GC困扰?如果内存已正确释放,则无需担心。但是如果你想发现导致堆增长的原因(即使你不是泄漏),请看看:How can I take a heap dump on Java 5 without garbage collecting first?。