PermGen exhaustions in
combination with ThreadLocal
are
often caused by classloader leaks.
An example:
Imagine an application server which has a pool of worker
threads.
They will be kept alive until application server termination.
A deployed web application uses a static ThreadLocal
in
one of its classes in order to store some thread-local data, an instance of another class (lets call it SomeClass
)
of the web application. This is done within the worker thread (e.g. this action originates from a HTTP request).
Important:
By
definition, a reference to a ThreadLocal
value is
kept until the "owning" thread dies or if the ThreadLocal itself is no longer reachable.
If the web application fails
to clear the reference to the ThreadLocal
on
shutdown, bad things will happen:
Because the worker thread will usually never die and the reference to the ThreadLocal
is
static, the ThreadLocal
value still
references the instance of SomeClass
,
a web application's class - even if the web application has been stopped!
As a consequence, the web application's classloader
cannot be garbage collected, which means that all
classes (and all static data) of the web application remain
loaded (this affects the PermGen memory pool as well as the heap).
Every redeployment iteration of the web application will increase permgen (and heap) usage.
=> This is the permgen leak