我在独立环境中使用 Spring3.1。
(此问题与 Spring 无关。它在独立环境中的行为也相同。)
我实现了一个从主题接收消息的侦听器。消息速率非常高(大约 20/30 m/s)。
有些消息可能比其他消息需要更多的处理时间。
侦听器使用相同的实例,这意味着如果一条消息处理时间过长,它会严重影响我们的性能。
我们考虑过使用自己的对象池而不是使用相同的侦听器实例,但后来我发现了Executors (java.util.concurrent.Executors)。
因此,对于收到的每条消息,都会为其分配一个不同的线程。这将确保我们的侦听器实例可以自由地并行处理消息。
private ExecutorService threadPool = Executors.newFixedThreadPool(100);
@Override
public void onMessage(final Message msg)
{
Runnable t = new Runnable()
{
public void run()
{
onSessionMessage(msg);
log.trace("AbstractSessionBean, received messge");
}
};
threadPool.execute(t);
}
这似乎解决了我们的性能问题。但是在使用 jconsole 监控应用程序之后,我们现在面临着巨大的内存泄漏。
堆内存使用量随时间显着增加。
所以我尝试用 FixedThreadPool 大小数字“玩”一点。仍然有大量内存使用:
知道如何解决这个问题吗?还有其他想法可以解决我的关键问题吗?
运行堆转储后,我遇到了两个问题嫌疑人:
谢谢,雷。