在Scala和Tomcat中使用TriMap的潜在内存泄漏

在Scala和Tomcat中使用TriMap的潜在内存泄漏,scala,tomcat,scala-collections,scala-2.10,Scala,Tomcat,Scala Collections,Scala 2.10,我使用对象中包装的scala.collection.concurrent.TriMap来存储远程获取的配置值 对象持久性内存映射{ val存储:TrieMap[String,CacheEntry]=TrieMap[String,CacheEntry] } 它工作正常,但我注意到当Tomcat关闭时,它会记录一些关于潜在内存泄漏的警告消息 2013年6月27日08:58:22 org.apache.catalina.loader.WebappClassLoader检查线程LocalMapForLe

我使用对象中包装的scala.collection.concurrent.TriMap来存储远程获取的配置值

对象持久性内存映射{ val存储:TrieMap[String,CacheEntry]=TrieMap[String,CacheEntry] } 它工作正常,但我注意到当Tomcat关闭时,它会记录一些关于潜在内存泄漏的警告消息

2013年6月27日08:58:22 org.apache.catalina.loader.WebappClassLoader检查线程LocalMapForLeaks ALLVARLIG:web应用程序[]创建了一个ThreadLocal,其键类型为[scala.concurrent.forkjoin.ThreadLocalRandom$1]值[scala.concurrent.forkjoin.ThreadLocalRandom]$1@5d529976]和类型为[scala.concurrent.forkjoin.ThreadLocalRandom]的值[scala.concurrent.forkjoin]。ThreadLocalRandom@59d941d7]但在web应用程序停止时无法删除它。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏 我猜这个线程最终会自行终止,但我想知道是否有某种方法可以杀死它,或者我应该让它单独存在吗?

scala.concurrent.forkjoin.ThreadLocalRandom的值在每个线程中只创建一次。除了该线程使用的随机值生成器之外,它不保存对对象的任何引用—它使用的内存具有固定大小。一旦线程被垃圾收集,它的线程本地随机值也将被收集——您应该让GC完成它的工作

您仍然可以手动删除它,方法是使用Java反射删除ThreadLocalRandom类中静态字段localRandom上的私有修饰符:

然后,您可以调用localRandom.setnull以清空对随机数生成器的引用。然后还应确保不再从该线程使用TrieMap,否则ThreadLocalRandom将通过假设随机数生成器不同于null而中断

在我看来,这似乎有点老套,我认为您应该坚持让GC收集线程本地值。

scala.concurrent.forkjoin.ThreadLocalRandom的值在每个线程中只创建一次。除了该线程使用的随机值生成器之外,它不保存对对象的任何引用—它使用的内存具有固定大小。一旦线程被垃圾收集,它的线程本地随机值也将被收集——您应该让GC完成它的工作

您仍然可以手动删除它,方法是使用Java反射删除ThreadLocalRandom类中静态字段localRandom上的私有修饰符:

然后,您可以调用localRandom.setnull以清空对随机数生成器的引用。然后还应确保不再从该线程使用TrieMap,否则ThreadLocalRandom将通过假设随机数生成器不同于null而中断

对我来说似乎有点不对劲,我认为你应该坚持让GC收集线程本地值