Discussed in #7082
Originally posted by asclark109 February 7, 2025
I am using the io.opentelemetry:opentelemetry-exporter-common:1.38.0 jar in my java web application project running on Tomcat 10. I am getting memory leaks at application shutdown (one is a io.netty.util.internal.InternalThreadLocalMap that is tracked in Netty). The other appears below.
07-Feb-2025 12:36:08.735 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [agtest-trunk] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@658c5a19]) and a value of type [io.opentelemetry.exporter.internal.marshal.CodedOutputStream.OutputStreamEncoder] (value [io.opentelemetry.exporter.internal.marshal.CodedOutputStream$OutputStreamEncoder@421e361]) 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.
I have looked at your class in release 1.38.0 and on main: CodedOutputStream.java
I notice that a ThreadLocal is created and updated but never cleaned up (i.e. there is no call to do THREAD_LOCAL_CODED_OUTPUT_STREAM.remove()).
|
private static final ThreadLocal<OutputStreamEncoder> THREAD_LOCAL_CODED_OUTPUT_STREAM = |
|
new ThreadLocal<>(); |
|
|
|
/** |
|
* Create a new {@code CodedOutputStream} wrapping the given {@code OutputStream}. |
|
* |
|
* <p>NOTE: The provided {@link OutputStream} <strong>MUST NOT</strong> retain access or modify |
|
* the provided byte arrays. Doing so may result in corrupted data, which would be difficult to |
|
* debug. |
|
*/ |
|
static CodedOutputStream newInstance(final OutputStream output) { |
|
OutputStreamEncoder cos = THREAD_LOCAL_CODED_OUTPUT_STREAM.get(); |
|
if (cos == null) { |
|
cos = new OutputStreamEncoder(output); |
|
THREAD_LOCAL_CODED_OUTPUT_STREAM.set(cos); |
|
} else { |
|
cos.reset(output); |
|
} |
|
return cos; |
|
} |
If someone can offer help to get around this (or patch a fix), it would be appreciated. thanks.
Only discussion page I could find on ThreadLocals #6584
Discussed in #7082
Originally posted by asclark109 February 7, 2025
I am using the io.opentelemetry:opentelemetry-exporter-common:1.38.0 jar in my java web application project running on Tomcat 10. I am getting memory leaks at application shutdown (one is a io.netty.util.internal.InternalThreadLocalMap that is tracked in Netty). The other appears below.
I have looked at your class in release 1.38.0 and on main: CodedOutputStream.java
I notice that a ThreadLocal is created and updated but never cleaned up (i.e. there is no call to do
THREAD_LOCAL_CODED_OUTPUT_STREAM.remove()).opentelemetry-java/exporters/common/src/main/java/io/opentelemetry/exporter/internal/marshal/CodedOutputStream.java
Lines 85 to 104 in 30d16eb
If someone can offer help to get around this (or patch a fix), it would be appreciated. thanks.
Only discussion page I could find on ThreadLocals #6584