【发布时间】:2014-09-27 10:00:06
【问题描述】:
Apache Tomcat 说了很多遍:
Web 应用程序 [/MyServlet] 似乎启动了一个名为 [pool-61-thread-2] 的线程,但未能停止它。这很可能会造成内存泄漏。
这很危险吗? servlet 应该能够每天处理 10.000 个请求。 完成后如何关闭线程?
class Worker {
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
private final int threadNumber;
Worker(
CountDownLatch startSignal,
CountDownLatch doneSignal,
int threadNumber
){
this.startSignal = startSignal;
this.doneSignal = doneSignal;
this.threadNumber = threadNumber;
}
public String[][] getSomeStrArrArr() {
String[][] isRs = new String[8][20];
String[][] inRs = new String[8][20];
String[][] iwRs = new String[8][20];
try {
startSignal.await();
if (threadNumber == 1) {
// get String[][] result for thread number 1
isRs = getIS(erg1, erg2, request);
}
if (threadNumber == 2) {
// get String[][] result for thread number 2
inRs = getIN(search_plz, request);
}
if (threadNumber == 3) {
// get String[][] result for thread number 3
iwRs = getIW(erg1, erg2, request);
}
doneSignal.countDown();
} catch (InterruptedException ex) {
System.out.println(
"Thread number "+threadNumber+" has been interrupted."
);
}
if (threadNumber == 1) {
return isRs;
}
if (threadNumber == 2) {
return inRs;
}
if (threadNumber == 3) {
return iwRs;
}
return null;
}
public Callable<String[][]> getSomeCallableStrArrArr(){
return new Callable<String[][]>() {
public String[][] call() throws Exception {
return getSomeStrArrArr();
}
};
}
}
ExecutorService pool = Executors.newFixedThreadPool(3);
Set<Future<String[][]>> set = new HashSet<Future<String[][]>>();
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(3);
for (int i=1;i<=3;i++) {
Worker worker = new Worker(startSignal,doneSignal,i);
Callable<String[][]> callable =
worker.getSomeCallableStrArrArr();
Future<String[][]> future = pool.submit(callable);
set.add(future);
}
startSignal.countDown();
try {
doneSignal.await();
【问题讨论】:
-
通常你不应该在多线程环境中初始化新线程,而是让应用服务器处理它们,除非你知道你在做什么。我们需要更多信息来更好地了解您的问题,或者使用像 Eclipse Memory Analyzer 这样的分析器来检查内存泄漏的位置。
-
干净的重新部署在Tomcat(不仅仅是Tomcat)中是一件非常脆弱的事情。重新启动服务器通常是不可避免的,然后泄漏就不是问题了。
-
抱歉,您的意思是什么以及如何避免这种情况?
标签: java multithreading tomcat servlets memory-leaks