如何修复 MQTT 应用程序的内存泄漏?

How to fix memory leak from an MQTT app?

我有一个使用 paho mqtt 库的应用程序。 我注意到 VisualVM 我的应用程序中似乎存在内存泄漏。

以下是部分截图:

首先我不明白为什么会有这样的峰值,如果有人能解释一下,我将不胜感激。 然后你可以看到应用程序开始时大约有 5Mb 内存,结束时超过 10Mb,我断定某处存在内存泄漏,对吗?

这是我执行垃圾收集器后的屏幕截图:

您可以看到它 returns 到大约 5Mb 的内存,但仍然在一次又一次地增长。

我不知道这是否有用,但我截屏以了解此内存增长来自哪个线程:

我希望有人能够帮助我。非常感谢!

这是一个Heisenbug. In other words, you are observing that you are observing(说得好,我不得不link)。 JMX 正在消耗内存以通过 RMI 向您发送内存统计信息。如果您想知道您的应用实际消耗了多少,请定期查询 Runtime.max/total/freeMemory 并将其记录到文件或其他内容中。

该图看起来像 generational garage 收集器的输出,没有显示内存泄漏。锯齿状的是年轻一代在工作,基线的增加是长期存在的数据被复制到老年代。

在触发收集后图形重置为 5mb 的事实是老年代正在清理并释放从年轻代复制过来的现在未引用的数据。