题
我正在运行JBoss 5.我发现随着时间的推移,内存保持不断增加。 活动线程数正在增加。以下堆栈跟踪取自活动线程,该活动线程是许多线程之一(这些线程是作为时间传递添加的线程)。 我可以从堆栈跟踪中学到什么?我怎样才能更深入地了解正在发生的事情?
名称:WorkManager(2)-92 状态:在java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@4e2e52上等待 总被阻止:1总等待:1
堆栈跟踪: sun.misc.Unsafe.park(原生方法) java.util.concurrent.locks.LockSupport.park(LockSupport.java:158) java.util.concurrent.locks.AbstractQueuedSynchronizer中的$ ConditionObject.await(AbstractQueuedSynchronizer.java:1925) java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:358) java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:907) java.lang.Thread.run(Thread.java:619)
谢谢, 杆
解决方案
该线程看起来正在等待getTask(),即它只是在等待一些工作要做。
新线程会在请求进入时生成,除非有大量线程忙于实际工作,否则不要担心它。
内存使用量会随着时间的推移而增长,直到JVM决定垃圾收集部分内容。如果它继续增长,并且从jconsole运行GC没有任何区别,那么你可能会发生内存泄漏。查找泄漏可能很困难,但您可以使用 MAT 来简化。