我的MINA客户端有点问题。
我只创建一个到服务器的连接,然后服务器定期每秒发送一些数据。
简而言之,客户端连接到服务器;服务器将字符串发送回客户端,所有这些步骤使用相同的打开连接(相同的客户端对象和客户端处理程序)。
但问题是,我认为,旧的数据不是由GC收集的。使用的堆在几秒钟内变得越来越大,永远不会减少。我的messageReceived方法是空的!
public void messageReceived(IoSession session, Object message) { }
有什么想法吗?
答案 0 :(得分:1)
VisualVM本身会造成大量垃圾。您可以启动一个空应用程序并休眠线程,启用VisualVM并观察垃圾开始收集。没有代码。
然而,我看到一个类似的问题,其中mina没有保留,但生成从不垃圾收集的长期运行项目(除非你运行Full GC)。此问题可能会导致实际内存为4mb的应用程序在一小时内显示为80mb。它永远不会被收集。
我即将构建自己的框架来包装NIO,因为我无法长时间保持服务器在线,而不会像这样重新启动。
答案 1 :(得分:0)
如果它永远不会减少,请启用-XX:+HeapDumpOnOutOfMemoryError
,您将在内存不足错误时获得堆转储。
使用的内存量并不重要,只有完整GC后才能保留多少内存。我建议你定期运行VisualVM和tirgger一个完整的GC,看看之后有多少空闲。