RFR 8003421: NPG: Move oops out of InstanceKlass into mirror

Coleen Phillimore coleen.phillimore at oracle.com
Tue May 21 07:12:44 PDT 2013


On 05/21/2013 05:11 AM, Stefan Karlsson wrote:
> Hi Coleen,
>
> Good to see all these oops moving to the mirrors. I think the changes 
> look good. I let someone else review the SA changes

Yes, I'm hoping for someone to review the SA changes.
>
> Some comments below:
>
> On 05/21/2013 12:39 AM, Coleen Phillimore wrote:
>> Summary: Inject protection_domain, signers, init_lock into 
>> java_lang_Class
>>
>> Net footprint change is zero except that these fields are in Java 
>> heap rather than metaspace.
>
> There should be some memory saved since we now use compressed oops for 
> the embedded fields.

That's right.
>
>> This helps a little with InstanceKlass size which is in fixed size 
>> space with UseCompressedKlassPointers. Included serviceability 
>> because there were SA changes to code that I don't know is used.
>>
>> Future work is to remove the signers field and the unused 
>> SetProtectionDomain function.
>>
>> open webrev at http://cr.openjdk.java.net/~coleenp/8003421/
>> bug link at http://bugs.sun.com/view_bug.do?bug_id=8003421
>
> http://cr.openjdk.java.net/~coleenp/8003421/src/share/vm/oops/instanceKlass.hpp.patch 
>
>
>    // protection domain
> -  oop protection_domain()                  { return 
> _protection_domain; }
> -  void set_protection_domain(oop pd)       { 
> klass_oop_store(&_protection_domain, pd); }
> +  oop protection_domain() const;
> +  void set_protection_domain(Handle pd);
> ...
>    // signers
> -  objArrayOop signers() const              { return _signers; }
> -  void set_signers(objArrayOop s)          { 
> klass_oop_store((oop*)&_signers, s); }
> +  objArrayOop signers() const;
> +  void set_signers(objArrayOop s);
>
> You don't really need the setters on the InstanceKlass anymore. They 
> are only used in jvm.cpp where they take a couple of unnecessary 
> indirections: mirror -> IK -> mirror->set_protection_domain/set_signers.
>

I left these accessor functions in with a comment that JVMTI spec 
defined these fields in InstanceKlass and we have to simulate that they 
are still there for compatibility.

> http://cr.openjdk.java.net/~coleenp/8003421/src/share/vm/oops/arrayKlass.cpp.udiff.html 
>
>
> -  java_lang_Class::create_mirror(k, CHECK);
> +  java_lang_Class::create_mirror(k, Handle(NULL), CHECK);
>
> You use NULL here since typeArrays always return a NULL pd, and 
> objArrays always returns the pd of the bottom klass?
>

Yes.
> http://cr.openjdk.java.net/~coleenp/8003421/src/share/vm/oops/instanceKlass.cpp.patch 
>
>
> -void InstanceKlass::oops_do(OopClosure* cl) {
> -  Klass::oops_do(cl);
> -
> -  cl->do_oop(adr_protection_domain());
> -  cl->do_oop(adr_signers());
> -  cl->do_oop(adr_init_lock());
> -
> -  // Don't walk the arrays since they are walked from the 
> ClassLoaderData objects.
> -}
>
> If we could move ArrayKlass::_component_mirror into the j.l.Class, 
> then _java_mirror would be the only oop in the klasses and we could 
> make Klass::oops_do non-virtual ...
>

That would add a field to all mirrors though.  It's a bit harder but it 
would be nice to have smaller mirrors for array klasses vs. instanceKlasses.


> Another thing. If we could direct-allocate the java mirrors in the old 
> gen, then we wouldn't have to walk all the klasses during the young 
> GCs. This would make the GCs a bit less complicated and we could get 
> rid of these fields in Klass:
>
>   // Remembered sets support for the oops in the klasses.
>   jbyte _modified_oops;             // Card Table Equivalent (YC/CMS 
> support)
>   jbyte _accumulated_modified_oops; // Mod Union Equivalent (CMS support)
>

Yes, we want to move in this direction!  Not with this change though.

Coleen
> thanks,
> StefanK
>
>>
>> Tested with vm.quick.testlist, JPRT, jtreg java/security tests and 
>> jck8 tests.
>>
>> Thanks,
>> Coleen
>



More information about the serviceability-dev mailing list