与此问题类似:setContextClassLoader implications,我试图清除有关内存泄漏的警告。具体来说,我有一个Servlet,其代码如下:

public void doGet(HttpServletRequest httpRequest,
        HttpServletResponse httpResponse) throws ServletException, IOException {
    class BasicThread extends Thread {
        public void run() {
            // Do a finite amount of stuff here
        }
    }
    Thread thread = new BasicThread();
    //thread.setContextClassLoader(null);
    thread.start();
}

本文:http://wiki.apache.org/tomcat/MemoryLeakProtection#cclThreadSpawnedByWebApp,指示如果我取消注释setContextClassLoader行,则错误消息将消失。

但是我的问题是:是否存在内存泄漏?如果是这样,我不想只是消除警告,我想解决泄漏问题。我该怎么做?

谢谢。

(同样,如果我将行“//在这里做有限的事情”更改为“//在这里做无限的事情(即,永远循环)”,那么确保内存没有泄漏的正确方法是什么?这种情况?)

最佳答案

如果满足以下条件,这只是一个实际问题。 1.线程永不停止,如果线程永不停止,则不存在GC根目录,并且永远不会垃圾回收ClassLoader。 2.您的应用程序正在进行热部署,那么您绝对应该考虑到这一点。

潜在的问题是,当您要取消部署和重新部署时,应用程序服务器将需要对WAR的类加载器进行GC。如果WAR创建了一个强烈引用WAR的类加载器的线程,并且该线程尚未完成,则classlodaer永远无法收集到垃圾,最终您将看到内存不足:Permagen。

如果您为每个部署重新启动服务器(和JVM),该问题将不会显现。

我通读了您发布的文章,它们准确地描述了我的建议



有关更多引用,我询问了有关类加载器泄漏的类似question

10-04 12:10