Java setContextClassLoader含义

Java setContextClassLoader含义,java,multithreading,tomcat,jakarta-ee,Java,Multithreading,Tomcat,Jakarta Ee,我正试图清除Tomcat关于由于创建自己的线程而导致内存泄漏的警告。建议在启动线程之前调用myThread.setContextClassLoader(null) 这个电话意味着什么?run()方法中的代码仍然能够解析我的应用程序中的类吗?是的。Thread.getContextClassLoader()是通用框架从类加载器树的下一级加载资源的机制 以Tomcat的类装入器层次结构为例 Bootstrap | System |

我正试图清除Tomcat关于由于创建自己的线程而导致内存泄漏的警告。建议在启动线程之前调用
myThread.setContextClassLoader(null)


这个电话意味着什么?run()方法中的代码仍然能够解析我的应用程序中的类吗?

是的。
Thread.getContextClassLoader()
是通用框架从类加载器树的下一级加载资源的机制

以Tomcat的类装入器层次结构为例

      Bootstrap
          |
       System
          |
       Common
       /     \
  Webapp1   Webapp2 ... 
servlet或JSP框架驻留在
Common
类加载器中。如果这些框架之一要从
Webapp1
加载类路径资源,它们可以尝试:

getClass().getResource("/some/resource/in/webapp1"); // fail
但是由于类装入机制只调用类装入器链,这将失败。这意味着所有需要加载资源的框架都会:

Thread.currentThread().getContextClassLoader().getResource("/some/resource/in/webapp1");
每当线程在该上下文中执行时,servlet容器确保这是
Webapp1
类加载器。因此线程的上下文类加载器是框架从“错误方向”加载类的有效方法

生成新线程时,默认情况下,该线程将获得其父线程(您的
Webapp1
classloader)的上下文类加载器。如果您因此停止
Webapp1
,tomcat应该能够GC该webapp,但只要
Webapp1
类加载器还有任何引用,tomcat就无法这样做-因此发出警告


.currentThread().getContextClassLoader()需要先设置它们。既然我没有访问代码的权限,如何使用Tomcat配置设置它们?