Вкратце - tomcat использует пул потоков, поэтому потоки повторно используются. Некоторые библиотеки используют переменные ThreadLocal
, но не очищают их (используя .remove()
), поэтому на самом деле они возвращают "грязные" потоки в пул.
Tomcat имеет новые функции обнаружения этих вещей при выключении и очистки локаторов потоков. Но это означает, что потоки "грязны" во время всего выполнения.
Что я могу сделать, это реализовать Filter
, и сразу после завершения запроса (и поток возвращается в пул) очистите все ThreadLocal
s, используя code from tomcat (метод называется checkThreadLocalsForLeaks
).
Вопрос в том, стоит ли это? Два плюса:
- предотвращение утечки памяти
- предотвращение неопределенного поведения библиотеками, которые предполагают, что поток "свежий"
Один символ:
- Решение использует отражение, поэтому оно потенциально замедляется. Все данные отражения (
Field
s) будут, конечно, кэшированы, но все же.
Другой вариант - сообщить об этой проблеме в библиотеки, которые не очищают локаторы потоков.