Skip to content

Commit 6f666c2

Browse files
committed
fix: switch to a bounded LRU cache for the Consumer<RecordedEvent> instances
See: [#14047](#14047)
1 parent a8508fe commit 6f666c2

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

instrumentation/runtime-telemetry/runtime-telemetry-java17/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java17/internal/AbstractThreadDispatchingHandler.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55

66
package io.opentelemetry.instrumentation.runtimemetrics.java17.internal;
77

8-
import java.util.HashMap;
8+
import java.util.Collections;
9+
import java.util.LinkedHashMap;
910
import java.util.Map;
1011
import java.util.function.Consumer;
1112
import jdk.jfr.consumer.RecordedEvent;
@@ -15,8 +16,17 @@
1516
* any time.
1617
*/
1718
public abstract class AbstractThreadDispatchingHandler implements RecordedEventHandler {
18-
// Will need pruning code for fast-cycling thread frameworks to prevent memory leaks
19-
private final Map<String, Consumer<RecordedEvent>> perThread = new HashMap<>();
19+
private final Map<String, Consumer<RecordedEvent>> perThread =
20+
Collections.synchronizedMap(
21+
// Use an access-ordered LinkedHashMap so we get a bounded LRU cache
22+
new LinkedHashMap<String, Consumer<RecordedEvent>>(16, 0.75F, true) {
23+
24+
@Override
25+
protected boolean removeEldestEntry(Map.Entry<String, Consumer<RecordedEvent>> eldest) {
26+
// Bound this map to prevent memory leaks with fast-cycling thread frameworks
27+
return size() > 1024;
28+
}
29+
});
2030
private final ThreadGrouper grouper;
2131

2232
protected AbstractThreadDispatchingHandler(ThreadGrouper grouper) {

0 commit comments

Comments
 (0)