On 04/25/2015 02:12 AM, John Rose wrote:
On Apr 24, 2015, at 3:24 PM, Peter Levart <peter.lev...@gmail.com <mailto:peter.lev...@gmail.com>> wrote:

Anyway. The inexact invoke() always transforms a specific MH to a generic one (Object, Object, ...)Object, right?

Yes.

So using inexact invoke() on any MH can't trigger the leak. It's just that if someone attempts to transform a generic MH to some more concrete one to be able to "connect" it with further transformations does the danger of the leak appear.

Good point, thanks.

This suggests that the right answer is to keep the 1-element cache as-is,
but don't fill it with any mh1=mh0.asType(...) for which mh1.type introduces
a class loader not already present in mh0.type.

I.e., don't use a weak reference for the 1-element cache, but don't fill it
with anything that might require a weak reference.  Use a backup cache
(if needed) to handle exotic type changes.

So maybe, just for the purpose of inexact invoke(), the caching could be performed just in case when asType transformed method type is of the form (Object, Object, ...)Object. This would also prevent accidental thrashing of the cache when inexact invoke() is intermixed with other asType() invocations.

The 1-element cache thrashes for other reasons already, and
I think we need a multi-way (multi-MH) backup cache of some sort.
The backup cache would have weak references.

Having a 1-element front-side cache would cover inefficiencies
in the backup cache, which in turn would cover inefficiencies
for generating new conversion LFs and/or MHs.

One interesting point:  If we change the 1-element cache to use
a weak reference, the cost of reloading the cache will be higher,
since each reload must create a new WeakReference instance.
This is a possible reason to hold off on the suggested fix.

— John

I thought so, yes. But checking for the cache-ability might not be free either. OTOH asTypeUncached() logic is not trivial as it is. It already includes checks like isConvertibleTo, etc, so another check might not be costly relatively. And not introducing another de-reference (WeakReference) makes the fast-path (the cache hit) unaffected.

Something like the following then?

http://cr.openjdk.java.net/~plevart/jdk9-dev/MethodHandle.asTypeCacheLeak/webrev.02/

Regards, Peter



_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to