-
Bug
-
Resolution: Unresolved
-
P4
-
None
-
25
-
None
The Entry in the cache array of a ClassValueMap keeps a value in an outdated association alive when the ClassValue is garbage collected, which is technically a resource leak.
See this test:
@Test
void testWeakAgainstClassValue() {
ClassValue<int[]> cv = new ClassValue<>() {
@Override
protected int[] computeValue(Class<?> type) {
return new int[23];
}
};
WeakReference<?> ref = new WeakReference<>(cv.get(int.class));
cv = null; // Remove reference for interpreter
if (!ForceGC.wait(() -> ref.refersTo(null))) {
fail("Timeout");
}
}
See this test:
@Test
void testWeakAgainstClassValue() {
ClassValue<int[]> cv = new ClassValue<>() {
@Override
protected int[] computeValue(Class<?> type) {
return new int[23];
}
};
WeakReference<?> ref = new WeakReference<>(cv.get(int.class));
cv = null; // Remove reference for interpreter
if (!ForceGC.wait(() -> ref.refersTo(null))) {
fail("Timeout");
}
}