java.lang.instrument.Instrumentation.getObjectSize for java.lang.Class instance
Peter Levart
peter.levart at gmail.com
Fri Dec 14 23:37:56 PST 2012
Thanks Kris, very much. That answers my question and more.
Regards, Peter
On 12/14/2012 07:40 PM, Krystal Mok wrote:
> Hi Peter,
>
> Which version of JDK are you using? Assuming you're using a JDK6/JDK7
> version released to date, the actual implementation for
> j.l.i.Instrumentation.getObjectSize() is as follows:
>
> jvmtiError
> JvmtiEnv::GetObjectSize(jobject object, jlong* size_ptr) {
> oop mirror = JNIHandles::resolve_external_guard(object);
> NULL_CHECK(mirror, JVMTI_ERROR_INVALID_OBJECT);
>
> if (mirror->klass() == SystemDictionary::Class_klass()) {
> if (!java_lang_Class::is_primitive(mirror)) {
> mirror = java_lang_Class::as_klassOop(mirror);
> assert(mirror != NULL, "class for non-primitive mirror must exist");
> }
> }
>
> *size_ptr = mirror->size() * wordSize;
> return JVMTI_ERROR_NONE;
> } /* end GetObjectSize */
>
> So there's special handling for j.l.Class instances' size: it's
> reporting the size of the klassOop (the VM internal type that holds
> the metadata). That's why changing the number of fields in j.l.Class
> doesn't affect the result of getObjectSize(clazz).
>
> (BTW, the code is a bit different after NoPermGen, but the idea stays the same.)
>
> Regards,
> Kris
>
> On Sat, Dec 15, 2012 at 2:18 AM, Peter Levart <peter.levart at gmail.com> wrote:
>> Hi,
>>
>> Does anybody know what the size returned by
>> java.lang.instrument.Instrumentation.getObjectSize when passed a Class
>> instance actually means? It is different for various Class instances
>> (contains static fields of various classes?). It's also quite big (520 bytes
>> for Object.class on 64bit JVM without compressed OOPS). If I remove some
>> instance fields from java.lang.Class the reported size stays the same.
>>
>> Regards, Peter
>>
More information about the hotspot-runtime-dev
mailing list