2012-08-09 380 views
2

我正在编写一个应用程序,该应用程序应该运行多个小时(10-100),我使用JMX进行监视。JMX RMI - 内存泄漏 - ArrayNotificationBuffer随着时间变得越来越大

然而,一段时间后,我发现两件事情:

  • com.sun.jmx.remote.internal.ArrayNotificationBuffer#1变得更大:20小时后,它的大约10MB的 - 当我开始它,它是小于1个MB
  • 多个线程像RMI TCP Accept-0(或任何其他号码)和RMI-TCP-Connection(44)-[IP]随着时间的推移实例化。

我在想,它与应用程序的不同连接有关,但目前我只连接了一次,但一些连接似乎仍然打开。

这怎么可能?我怎样才能解决这个问题?

+0

我不会使用RMI + JMX来长时间监视应用程序。它会产生相当多的垃圾。我会用一个简单的日志文件和/或套接字来发布你所需要的信息。 – 2012-08-09 12:51:47

+0

为什么要重新发明轮子?我想要内存和CPU使用情况统计信息。我不明白为什么我应该完全自己写下 – Stefan 2012-08-09 12:56:06

+0

除非它总是与你平平,否则你不需要重新发明轮子。 ;) – 2012-08-09 12:59:05

回答

1

我在ArrayNotificationBuffer的源代码注释中发现了它,它有相当数量的JMX跟踪日志记录,因此您可能想要enable JMX tracing更好地了解正在发生的事情。

您可能会发现this known bug正在影响您。该错误报告表明该问题是在长期连接中观察到的。有几个提到的解决方法,但更简单的解决方法不是,如果对您来说是可行的,那就是定期断开连接并重新连接。好消息是Java7中似乎有一个patch,尽管我不确定它是否已达到发布版本。

我也会确保,如果您正在注册JMX通知侦听器,那么它们会持续并及时地处理通知。不这样做也可能导致这种症状。

相关问题