RFR 8190359: Reduce the number of recorded klass dependencies
harold seigel
harold.seigel at oracle.com
Thu Feb 1 14:14:11 UTC 2018
Hi,
Please review version 3 of this change:
http://cr.openjdk.java.net/~hseigel/bug_8190359.3/webrev/index.html
The only change from the previous version is the addition of lines
342-347 to classLoaderData.cpp to handle the case pointed out by Coleen.
Thanks, Harold
On 1/31/2018 4:07 PM, coleen.phillimore at oracle.com wrote:
>
>
> On 1/31/18 4:02 PM, harold seigel wrote:
>> Hi Coleen,
>>
>> Thanks for reviewing this.
>>
>> See comments in-line.
>>
>>
>> On 1/31/2018 3:49 PM, coleen.phillimore at oracle.com wrote:
>>>
>>>
>>> On 1/31/18 3:18 PM, harold seigel wrote:
>>>> Hi Lois,
>>>>
>>>> Thanks for looking at this.
>>>>
>>>> Please see comments in-line.
>>>>
>>>>
>>>> On 1/31/2018 2:59 PM, Lois Foltan wrote:
>>>>> On 1/31/2018 2:36 PM, harold seigel wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> Please review this updated webrev containing the changes
>>>>>> suggested by Ioi.
>>>>>>
>>>>>> http://cr.openjdk.java.net/~hseigel/bug_8190359.2/webrev/index.html
>>>>>
>>>>> Looks okay. I have a couple of minor comments:
>>>>>
>>>>> 1. Why you were able to remove the check at line #347? It seems
>>>>> that now, if 'from's CLD is anonymous and also is in a parent CLD
>>>>> of 'to', a dependency will no longer be added for it, where in the
>>>>> old code it was?
>>>> if from's CLD is anonymous and 'from' is a parent CL of 'to' the
>>>> dependency will still get recorded because
>>>> java_lang_ClassLoader::isAncestor(from, to) returns TRUE if 'to' is
>>>> an ancestor of 'from', but FALSE if 'from' is an ancestor of 'to'.
>>>> So, in this case, it will return FALSE.
>>>
>>> So this is very confusing!
>>>
>>> I think I get it. If "from" is anonymous and "to" is not
>>> anonymous (already checked above), "to" won't get unloaded when it's
>>> an ancestor of "from"s class_loader.
>> Yes.
>>>
>>> There is the missing case if both are anonymous, you should check
>>> for equality at line 343.
>> I think that dependency has to be recorded. If both are anonymous
>> then by definition they have different CLD's. And, even if they have
>> the same CL, or to's CL is the parent of from's, the dependency has
>> to be recorded because, being anonymous, 'to' can go away at any time.
>
> Oh, but if toCLD == fromCLD, not their class loaders. ie, if you're
> recording a dependency to itself in the anonymous case.
>
>>>
>>> Otherwise, this looks really good. I like that you're using
>>> isAncestor.
>>>>
>>>>> 2. Just very minor, I don't prefer the new method
>>>>> is_permanent_class_loader_data, I would have preferred fixing
>>>>> is_builtin_class_loader to handle correctly the anonymous class
>>>>> loader data, but my understanding is that there is a later RFE
>>>>> that will address this, correct?
>>>> Yes. See JDK-8190235
>>>> <https://bugs.openjdk.java.net/browse/JDK-8190235>.
>>>
>>> The name "permanent" is odd but I can't think of a more concise name
>>> that means _is_not_unloaded.
>> I thought of 'eternal' or 'immortal' but prefer 'permanent'.
>>
>
> ha ha!
> Coleen
>
>> Thanks, Harold
>>>
>>> Thanks,
>>> Coleen
>>>>
>>>> Thanks! Harold
>>>>>
>>>>> Thanks,
>>>>> Lois
>>>>>
>>>>>
>>>>>>
>>>>>> Thanks! Harold
>>>>>>
>>>>>>
>>>>>> On 1/30/2018 7:07 PM, Ioi Lam wrote:
>>>>>>>
>>>>>>>
>>>>>>> On 1/30/18 12:30 PM, harold seigel wrote:
>>>>>>>> Hi Ioi,
>>>>>>>>
>>>>>>>> Thanks for looking at this! Please see comments inline.
>>>>>>>>
>>>>>>>> On 1/30/2018 2:50 PM, Ioi Lam wrote:
>>>>>>>>> Hi Harold,
>>>>>>>>>
>>>>>>>>> Why is this needed
>>>>>>>>>
>>>>>>>>> 336 if (from_cld == to_cld ...
>>>>>>>> It's not needed. I added it as a quick way to exclude many
>>>>>>>> potential dependencies. I can remove it.
>>>>>>>>>
>>>>>>>>> It seems like it's already checked by here
>>>>>>>>>
>>>>>>>>> 350 if (from == to ||
>>>>>>>>> java_lang_ClassLoader::isAncestor(from, to)) {
>>>>>>>> You are right. It is. The first 'if' clause also handles the
>>>>>>>> case where 'from_cld' and 'to_cld' have the same class loader,
>>>>>>>> but differ because 'from_cld' is anonymous.
>>>>>>>>>
>>>>>>>>> It's probably explained by this
>>>>>>>>>
>>>>>>>>> 348 assert(from != to || from_cld->is_anonymous(),
>>>>>>>>> "sanity check");
>>>>>>>> If line 336 is removed then I'll remove this assert because
>>>>>>>> it's no longer valid.
>>>>>>>>>
>>>>>>>>> ... but I think this is a rather tricky area so either (a)
>>>>>>>>> more comments might be needed in the source code, or (b)
>>>>>>>>> simplify the code so it requires less explanation.
>>>>>>>> Does removing lines 336 and 348 simplify the code?
>>>>>>>
>>>>>>> Hi Harold,
>>>>>>>
>>>>>>> Thanks for the explanation. I think removing these lines will
>>>>>>> make the code much easier to understand.
>>>>>>>
>>>>>>>>>
>>>>>>>>> Also, I wonder if it's possible to add a new test case for this.
>>>>>>>> Any suggestions on how to do this? If logging was added then
>>>>>>>> it would be easier to write tests, but I don't think logging is
>>>>>>>> needed here because recording dependencies is not something
>>>>>>>> users care about. Recording dependencies is an implementation
>>>>>>>> detail.
>>>>>>>>
>>>>>>> Ideally we should have a negative test case that tries to
>>>>>>> violates loader constraints, but is prevented to do so even when
>>>>>>> the constraints aren't recorded in this case. However, I've no
>>>>>>> idea how to write that :-(
>>>>>>>
>>>>>>> Thanks
>>>>>>> - Ioi
>>>>>>>
>>>>>>>
>>>>>>>> Thanks, Harold
>>>>>>>>>
>>>>>>>>> Thanks
>>>>>>>>>
>>>>>>>>> - Ioi
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 1/30/18 10:38 AM, harold seigel wrote:
>>>>>>>>>> Hi,
>>>>>>>>>>
>>>>>>>>>> Please review this RFR for JDK-11 to reduce the number of
>>>>>>>>>> class dependencies recorded by the VM. The change primarily
>>>>>>>>>> does this by not recording dependencies to classes that are
>>>>>>>>>> loaded by a builtin class loader and are not anonymous. These
>>>>>>>>>> classes never get unloaded, so no recorded dependency is needed.
>>>>>>>>>>
>>>>>>>>>> Additionally, the change simplifies the code that deals with
>>>>>>>>>> when the classes have the same class loader and when the
>>>>>>>>>> dependency is to a class loaded by a parent loader.
>>>>>>>>>>
>>>>>>>>>> Open Webrev:
>>>>>>>>>> http://cr.openjdk.java.net/~hseigel/bug_8190359/webrev/index.html
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> JBS Bug: https://bugs.openjdk.java.net/browse/JDK-8190359
>>>>>>>>>>
>>>>>>>>>> The change was tested with JPRT, Mach 5 tier1 - tier5 tests,
>>>>>>>>>> and non-colocated tonga tests. Additionally, print statements
>>>>>>>>>> were temporarily added to the code and the output analyzed to
>>>>>>>>>> check that dependencies were being correctly recorded or not
>>>>>>>>>> recorded.
>>>>>>>>>>
>>>>>>>>>> Thanks, Harold
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
More information about the hotspot-runtime-dev
mailing list