RFR: 8280041: Retry loop issues in java.io.ClassCache [v3]
Peter Levart
plevart at openjdk.java.net
Wed Jan 19 13:14:38 UTC 2022
On Wed, 19 Jan 2022 10:44:57 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:
> > So, this patch is fine for making ClassCache more robust as a re-usable component inside JDK (checking for non-null return of computeValue). The 2nd change, that apparently shields against unbounded accumulation of garbage, might not be enough in the sense that when garbage accumulated without bounds, there would be not progress. So before the patch, we would at least get an OOME and the loop would end. Now the loop could spin indefinitely. So perhaps we must rather prevent this from happening in some other way... I have an idea. Stay tuned.
>
> I think playing the catch-up race with GC (which we will eventually win, IMO) is better than obscure OOME. Note this matches other places we do the weak-reference loops, for example in `MethodType`: https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/invoke/MethodType.java#L1390-L1401
I do think that processing enqueued references more promptly is a correct move, so I don't oppose this patch. I'm merely saying that the concern about indefinite growing of reference queue is the same as concern about indefinite looping. In normal circumstances neither would be a problem. But if we are considering special circumstances, we could as well fix both potential problems.
For example, if construction of `CacheRef` object that stays referenced by ClassCache is guaranteed to be followed by at least one `.get()` invocation, the following variant of CacheRef would guarantee progress:
private static class CacheRef<T> extends SoftReference<T> {
private Class<?> type;
private T referent;
CacheRef(T referent, ReferenceQueue<T> queue, Class<?> type) {
super(referent, queue);
this.referent = referent;
this.type = type;
}
@Override
public T get() {
T referent = this.referent;
if (referent == null) {
return super.get();
} else {
this.referent = null;
return referent;
}
}
}
WDYT?
-------------
PR: https://git.openjdk.java.net/jdk/pull/7092
More information about the core-libs-dev
mailing list