RFR 6642881: Improve performance of Class.getClassLoader()
Christian Thalinger
christian.thalinger at oracle.com
Tue Jun 17 15:33:28 UTC 2014
On Jun 17, 2014, at 7:52 AM, Coleen Phillimore <coleen.phillimore at oracle.com> wrote:
>
> On 6/17/14, 10:08 AM, roger riggs wrote:
>> Hi,
>>
>> I'd favor David's suggestion also, omitting the constructor and initializing to null.
>
> I think I can't actually do this because as a final field, won't the JIT optimize it to always be null?
Coleen and I talked about this. Currently, AFAIK, our JITs don’t do this but we might in the future (or someone else when we are all not around anymore). I suggested this solution to be future-proof.
>
> Coleen
>
>>
>> Roger
>>
>> On 6/17/2014 1:30 AM, David Holmes wrote:
>>> On 17/06/2014 6:43 AM, Coleen Phillimore wrote:
>>>>
>>>> On 6/16/14, 1:50 PM, roger riggs wrote:
>>>>> Hi Colleen,
>>>>>
>>>>> In Class.java, if only the VM creates Class objects (comment at line
>>>>> 681),
>>>>> and it does not use the constructor then the code (line 136) in the
>>>>> constructor
>>>>> to set classloader is misleading and deserves a comment.
>>>>
>>>> Thanks, Roger. How about this comment?
>>>>
>>>> /*
>>>> * Constructor. Only the Java Virtual Machine creates Class
>>>> * objects, but this constructor prevents a warning that
>>>> classLoader is not
>>>> * initialized.
>>>> */
>>>> private Class(ClassLoader loader) {
>>>> classLoader = loader;
>>>> }
>>>
>>> Why not just initialize classloader to null when it is declared and leave the constructor alone? The constructor exists to prevent javac from creating a default constructor, and thus ensuring Class instances can not be created (which is what the original comment should, but doesn't quite, say).
>>>
>>> David
>>>
>>>> Coleen
>>>>>
>>>>> Roger
>>>>>
>>>>> On 6/16/2014 1:45 PM, Lois Foltan wrote:
>>>>>> Hi Coleen,
>>>>>> This looks good.
>>>>>> Lois
>>>>>>
>>>>>> On 6/16/2014 11:42 AM, Coleen Phillimore wrote:
>>>>>>> Summary: Add classLoader to java/lang/Class instance for fast access
>>>>>>>
>>>>>>> In order to improve performance of Class.getClassLoader() in a way
>>>>>>> to allow the compilers to automatically optimize this call, I added
>>>>>>> the classLoader to the instance of java/lang/Class. For
>>>>>>> microbenchmarks, this results in a 98% improvement, which was
>>>>>>> expected. For Oracle internal applications, this results in a
>>>>>>> 10-12% improvement on solaris/sparc. The increase in size of
>>>>>>> java/lang/Class can be offset by other changes (removing constant
>>>>>>> pool lock, or removing signers).
>>>>>>>
>>>>>>> See bug link https://bugs.openjdk.java.net/browse/JDK-6642881 and
>>>>>>> associated linked bugs for more details.
>>>>>>>
>>>>>>> open webrev at http://cr.openjdk.java.net/~coleenp/6642881_hotspot/
>>>>>>> open webrev at http://cr.openjdk.java.net/~coleenp/6642881_jdk/
>>>>>>>
>>>>>>> There is both hotspot and jdk changes for this change. The hotspot
>>>>>>> changes can work without the jdk changes (check for optional field),
>>>>>>> but not vice-versa. I'll file another bug (and compatibility
>>>>>>> request) to remove JVM_GetClassLoader from hotspot.
>>>>>>>
>>>>>>> Tested with jck lang, vm, api/java_lang tests with/without jdk
>>>>>>> change, nsk vm.quick.testlist and hotspot jtreg tests, and jprt.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Coleen
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>
>
More information about the jdk9-dev
mailing list