This article documents a possible known issue where there is ThreadLocal leak shown in the console logs when shutting down the application server:
The web application [ROOT] created a ThreadLocal with key of type
[java.lang.ThreadLocal] (value [java.lang.ThreadLocal@ccb08cb]) and a value
of type [io.netty.util.internal.InternalThreadLocalMap] (value
[io.netty.util.internal.InternalThreadLocalMap@21c8be8a]) 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.
Status: Won't Fix
Liferay Support Engineers have determined that the leak is caused by Netty, a third party vendor. There is a util method in Netty that attempts to clean up Threadlocal leaks but the error message still persists after the method has been invoked. It was discovered that this error is very common to implementations of Netty, including a dependency inside Elasticsearch, and most vendors, including Elasticsearch, will ignore the error. As a result, Liferay Support Engineers have deemed the impact to Liferay platforms and to customers to be minimal.
For more information, see LPS-83704.