Servlet “a commencé un fil, mais pas réussi à l'arrêter” fuite de mémoire dans Tomcat

Apache Tomcat dit de nombreuses fois:

L'application web [/MyServlet] semble avoir commencé un thread nommé [piscine-61-thread-2], mais n'a pas l'arrêter. Ce qui est très susceptible de créer une fuite de mémoire.

Est-ce dangereux? La servlet doit être capable de gérer 10.000 demandes/jour.
Comment fermer les fils quand ils ont fini?

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();
Habituellement, vous ne devriez pas initialiser de nouvelles discussions dans un environnement multithread, au lieu de laisser le serveur d'application poignée d'entre eux, sauf si vous savez ce que vous faites. Nous aurions besoin de plus d'informations pour obtenir une meilleure compréhension de votre problème, ou utiliser un profiler comme Eclipse de la Mémoire de l'Analyseur pour vérifier d'où la fuite de mémoire se trouve.
Nettoyer le reclassement est un très fragiles chose dans Tomcat (et pas seulement de Tomcat). Redémarrer le serveur est souvent inévitable, et puis les fuites ne sont pas un problème.
Sry, que voulez-vous dire par qui et comment l'éviter?

OriginalL'auteur user3876178 | 2014-08-04