由于探查器不断崩溃(热点错误),我很难跟踪此事。在我深入研究之前,我想知道我是否真的有问题:-)ExecutorService内存泄漏异常
我有几个线程池通过创建:Executors.newFixedThreadPool(10);这些线程连接到不同的网站,有时,我会拒绝连接,并抛出异常。
当我稍后调用Future.get()来获取结果时,它将捕获包装在无法建立连接时引发的异常的ExecutionException。
该程序使用相当不变的内存量,直到抛出异常的时间点(它们倾向于在特定站点过载时分批发生)。在此之后,记忆再次保持不变,但处于更高水平。
所以我的问题是大概是内存行为(由Unix上的“top”报告),因为异常只是触发了一些东西,或者我可能有一个实际的泄漏,我需要追踪?另外当Future.get()抛出一个异常时,除了捕获异常(比如调用Future.cancel())之外,还有什么需要做的吗?
编辑:所以我确实使用了几个工具来看看,从Java的角度来看没有任何内存泄漏明智。我会玩弄其他一些长期存在的代码,并在一段时间后引发异常,并查看“top”报告的内存是否也会增加。似乎它可能只是某种古怪。
在执行程序问题上没有你的答案,我可以告诉你,top不是诊断JVM中内存问题的有用方法(查看-Xmx和-Xms选项)。在GC上的JVM中恢复的内存不一定会显示在其外(我认为它不会出现,但我不完全确定)。要检查内存使用Runtime.getRuntime()。totalMemory() - Runtime.getRuntime()。freeMemory()。 – 2010-03-12 03:51:20