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