On 01/06/2016 09:34 PM, Peter Levart wrote:
I think that what you are asking for is impossible to achieve in
ClassValue API is basically a cache that maps a pair: (ClassValue<T>,
Class<?>) -> cached instance of type T
You would like the cached instance of type T to not be reachable from
either ClassValue<T> instance or from Class<?> instance, but still be
non-reclaimable while either of
correction: while either of ... or ... is -> while both of ... and ... are
ClassValue<T> instance or Class<?> instance is reachable in some other
way that excludes being reachable from the cached instance of type T.
For that to be achievable, Java would have to provide a feature called
Currently the cached instance of type T is reachable from Class<?>
instance and you are using Integer.TYPE in your example. Which means
that the cached instance of T is never going to be released if
ClassValue<T> instance is reachable from cached instance of T. In your
example, it is: (Dummy instance -> Dummy.class -> MyClassValue
instance). So you get this reachability chain: Integer.TYPE ->
ClassValueMap instance -> ClassValueMap.Entry -> ClassValueMap.Entry
-> Dummy instance -> Dummy.class -> MyClassValue instance.
Integer.TYPE is a Class<?> instance representing int type which is
loaded by bootstrap class loader, which never goes away.
ClassValue API could use a different strategy and reference the cached
instance of type T from ClassValue<T> instance instead, but then you
would have a problem with ClassValue instances reachable from other
class loaders than the cached instances of type T.
On 01/06/2016 06:14 PM, Craig Andrews wrote:
I apologize for contacting this list - I'm sure this isn't the "right
way" to contact the OpenJDK project, but I'm not clear what the
"right way" is.
I'm hoping to raise https://bugs.openjdk.java.net/browse/JDK-8136353
"ClassValue preventing class unloading" as I believe it's a
significant issue in ClassValue which is a blocker for its use in
dynamic languages (which is primiarly why ClassValue was introduced).
I think the P5 priority set on the bug now is way too low, perhaps
you could consider raising the priority?
The source code in the issue description is incorrect; it doesn't
compile. Could you please attach the working test cases to the issue,
so future testers and developers can reproduce the problem? Here are
links to the 2 source code files:
(which of course should be directly attached to the openjdk issue
tracker issue, and not hyperlinked to the Groovy tracker)
And to reproduce the issue, run:
$ javac MyClassValue.java && javac CVTest.java && mkdir -p t && jar
cvf t/t.jar MyClassValue*.class && rm MyClassValue*.class &&
JAVA_OPTS=-Xmx4m java CVTest
and wait for the an error to occur, which is:
Exception in thread "main" java.lang.OutOfMemoryError: Compressed
at java.lang.ClassLoader.defineClass1(Native Method)
at java.security.AccessController.doPrivileged(Native Method)
The bug is reproducible on all JDK 8 and 9 builds (I tested up to JDK
9 build 99).
Based on my understanding of the situation from my research in the
Groovy bug that discovered the issue (
https://issues.apache.org/jira/browse/GROOVY-6704 ) and some work
another person did with the YourKit profiler (
https://www.yourkit.com/forum/viewtopic.php?f=3&t=12658 ), I suspect
that the fix for https://bugs.openjdk.java.net/browse/JDK-8032606
"ClassValue.ClassValueMap.type is unused" is relevant; I think the
problem lies in the java.lang.Class.classValueMap implementation.
mlvm-dev mailing list
mlvm-dev mailing list