Clean up threadlocal after usage

ThreadLocal is not guaranteed to be garbage collected if the thread
keeps running. This can lead to a memory leak in applications with
long-living threads.

Fixes #303
This commit is contained in:
mishako 2016-07-15 22:18:29 +02:00
parent 998bf4ac8e
commit 9199f0d66b

View file

@ -41,17 +41,7 @@ public class ToStringBean implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger LOG = LoggerFactory.getLogger(ToStringBean.class);
private static final ThreadLocal<Stack<String[]>> PREFIX_TL = new ThreadLocal<Stack<String[]>>() {
@Override
public Stack<String[]> get() {
Stack<String[]> o = super.get();
if (o == null) {
o = new Stack<String[]>();
set(o);
}
return o;
}
};
private static final ThreadLocal<Stack<String[]>> PREFIX_TL = new ThreadLocal<Stack<String[]>>();
private static final Object[] NO_PARAMS = new Object[0];
@ -113,7 +103,15 @@ public class ToStringBean implements Serializable {
*/
@Override
public String toString() {
final Stack<String[]> stack = PREFIX_TL.get();
Stack<String[]> stack = PREFIX_TL.get();
boolean needStackCleanup = false;
if (stack == null) {
stack = new Stack<String[]>();
PREFIX_TL.set(stack);
needStackCleanup = true;
}
final String[] tsInfo;
if (stack.isEmpty()) {
tsInfo = null;
@ -128,7 +126,14 @@ public class ToStringBean implements Serializable {
prefix = tsInfo[0];
tsInfo[1] = prefix;
}
return this.toString(prefix);
final String result = toString(prefix);
if (needStackCleanup) {
PREFIX_TL.remove();
}
return result;
}
/**