gpt4 book ai didi

java - setContextClassLoader 的含义

转载 作者:行者123 更新时间:2023-11-28 21:57:14 24 4
gpt4 key购买 nike

类似于这个问题: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. 您的应用程序正在进行热部署,那么您一定要考虑到这一点。

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

如果您为每次部署重新启动服务器(和 JVM),问题就不会出现。

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

SEVERE: A web application appears to have started a thread named [leakingThread] but has failed to stop it. This is very likely to create a memory leak.

更多的引用点,我问了一个类似的question关于类加载器泄漏。

关于java - setContextClassLoader 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5183262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com