1

我的 MINA 客户有一点问题。

我只创建一个到服务器的连接,然后服务器每秒定期发送某种数据。

简而言之,客户端连接到服务器;服务器向客户端发送回一个字符串,所有这些步骤都使用相同的打开连接(相同的客户端对象和客户端处理程序)。

但问题是,我认为,旧数据不是由 GC 收集的。使用的堆在几秒钟内变得越来越大,并且永远不会减少。我的 messageReceived 方法是空的!

public void messageReceived(IoSession session, Object message) { }

任何想法 ?

4

2 回答 2

1

VisualVM 本身会造成很多垃圾。您可以启动一个空的应用程序并让线程休眠,启用 VisualVM 并观察垃圾开始收集。没有代码。

然而,我看到了一个类似的问题,即 mina 没有保留而是生成永远不会被垃圾收集的长期运行项目(除非您运行 Full GC)。此问题可能导致实际内存为 4mb 的应用程序在一小时内显示为 80mb。它永远不会被收集。

我即将构建自己的框架来包装 NIO,因为如果没有像这样重新启动,我永远无法让服务器长时间保持在线状态。

于 2013-01-08T07:32:35.607 回答
0

如果它从未减少,请启用-XX:+HeapDumpOnOutOfMemoryError,您将在内存不足错误时获得堆转储。

使用的内存量并不重要,重要的是在一次完整 GC 后保留了多少。我建议你定期运行 VisualVM 并触发一次完整的 GC,然后看看有多少空闲。

于 2012-12-05T10:16:57.153 回答