2013-06-27 2 views
1

Я использую scala.collection.concurrent.TriMap, завернутый в объект для хранения значений конфигурации, которые извлекаются удаленно.Потенциальная утечка памяти с использованием TriMap в Scala и Tomcat

object persistentMemoryMap { 
    val storage: TrieMap[String, CacheEntry] = TrieMap[String, CacheEntry]() 
} 

Это прекрасно работает, но я заметил, что когда Tomcat выключен он регистрирует тревожные сообщения о потенциальной утечке памяти

2013-jun-27 08:58:22 org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks 
ALLVARLIG: The web application [] created a ThreadLocal with key of type [scala.concurrent.forkjoin.ThreadLocalRandom$1] (value [[email protected]]) and a value of type [scala.concurrent.forkjoin.ThreadLocalRandom] (value [[email protected]]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak 

Я предполагаю, что это нить закончится по себе в конце концов, но я Мне интересно, есть ли способ убить его или я должен просто оставить его в покое?

ответ

4

Значение scala.concurrent.forkjoin.ThreadLocalRandom создается только один раз на поток. Он не содержит ссылок на объекты, отличные от генератора случайных величин, используемых этим потоком - память, которую он потребляет, имеет фиксированный размер. После того, как поток будет собран, будет собрано его локальное случайное значение потока - вы должны просто позволить GC выполнить свою работу.

Можно еще удалить его вручную с помощью Java отражения для удаления private модификатора на статическом поле localRandom в ThreadLocalRandom классе:

https://github.com/scala/scala/blob/master/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java#L62

Вы могли бы назвать localRandom.set(null) обнулять ссылку на генератор случайных чисел. Вы также должны убедиться, что TrieMap больше не используется из этого потока, в противном случае ThreadLocalRandom сломается, предположив, что генератор случайных чисел отличается от null.

Кажется, я взламываю, и я думаю, вы должны просто придерживаться того, чтобы GC собирал локальное значение потока.

 Смежные вопросы

  • Нет связанных вопросов^_^