我正在开发Web服务并创建线程本地实例,并且只想在app关闭期间删除它们(一旦为线程创建了threadlocal对象,我想在该线程上的不同服务调用期间使用该对象)。由于线程是由tomcat创建并拥有的,有没有办法在应用程序关闭期间删除那些threadlocals?
答案 0 :(得分:1)
Tomcat 6有内存泄漏检测,Tomcat 7具有实际删除逻辑 - 它会自动删除所有线程本地对象:http://wiki.apache.org/tomcat/MemoryLeakProtection
理想情况下,您应该在请求完成后从线程本地删除所有对象,因为同一个线程将被放回线程池并用于提供其他请求 - 在这种情况下,线程本地值可能会干扰后续请求逻辑,并导致各种安全问题。
但是,如果您特别希望在Tomcat webapp生命周期的整个持续时间内保持线程本地的值 - Tomcat 7将在webapp关闭时为您清理它,将其视为垃圾收集。