2012-12-05 19 views
1

我有一个关于我的MINA客户端的小问题。Apache MINA不会删除未使用的数据

我只创建一个连接到服务器,然后服务器每隔一秒钟发送一些数据。

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

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

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

有什么想法吗?

回答

0

如果它永不减少,启用-XX:+HeapDumpOnOutOfMemoryError,并且您将在出现内存不足错误时收到堆转储。

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

+0

我已经使用VisualVM监视系统并让它运行几分钟。正如我所料,使用的内存值增加,那么应用程序会抛出OutOfMemory异常。服务器向客户端发送字符串,我看到char []变量是增加的原因。客户端和服务器都有相互监听的线程。也许GC不收集字符(我不知道为什么)在线程?在这种情况下,我真的需要帮助 – ftb

+0

GC不会清理您保留的任何内容。你应该寻找*什么是引用char [] *,因为这是阻止它被清理。顺便说一句,我怀疑你的程序实际上保留了'String',除非你知道否则。 ;) –

+1

我看到,如果我创建一个新的Client对象,这意味着每次都有一个新的连接,则使用的mem不会增加。这意味着如果我杀死线程及其变量,则释放已用内存。 – ftb

1

VisualVM本身导致大量垃圾。您可以启动一个空白应用程序并休眠线程,启用VisualVM并观察垃圾收集开始。没有代码。

但是,我看到一个类似的问题,其中mina没有保留,但生成从未垃圾收集的长期项目(除非您运行完整的GC)。这个问题可能会导致具有4mb真实内存的应用程序在一个小时内显示为80mb。它永远不会被收集。

我即将构建我自己的框架来封装NIO,因为我无法长时间保持服务器在线状态,而无需像这样重新启动。

+0

我已经解决了这个问题,通过使用连接池根据它们的用法刷新套接字会话。例如,如果套接字及其会话被使用了50次(50个事务),则其线程被终止,刷新并重新连接。通过使用这种方法,我可以释放使用过的内存。不是最好的解决方案,而是它的工作! :) – ftb

+0

我确实继续前进,自己构建一切。单个套接字可以在每个方向上处理100MB/s,并且服务器永远不会使用超过3mb的内存。它会生成多达50mb的GC,每隔一段时间收集一次。 – bond