On Tue, 14 Mar 2023 01:25:01 GMT, Chris Plummer <[email protected]> wrote:
>> Frederic Parain has updated the pull request incrementally with one
>> additional commit since the last revision:
>>
>> Fixes includes and style
>
> src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Field.java line 75:
>
>> 73: int initialValueIndex;
>> 74: int genericSignatureIndex;
>> 75: int contendedGroup;
>
> It seems that these should all be shorts. All the getter methods are casting
> them to short.
Indexes in the constant pool are unsigned shorts, but Java shorts are signed,
using ints is the simplest way to store those indexes.
> src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java
> line 108:
>
>> 106: CLASS_STATE_INITIALIZATION_ERROR =
>> db.lookupIntConstant("InstanceKlass::initialization_error").intValue();
>> 107: // We need a new fieldsCache each time we attach.
>> 108: fieldsCache = new HashMap<Address, Field[]>();
>
> This should probably be a WeakHashMap. I tried it and it seems to work (or at
> least didn't cause any problems). However, when doing a heap dump I didn't
> notice the table being any smaller on exit when it was made weak, even though
> there were numerous GC's while dumping the heap.
>
> The `<key>` is the Address of the hotspot InstanceKlass instance, and this
> Address is referenced by the SA InstanceKlass mirror. So theoretically when
> the reference to the mirror goes way, then the cache entry can be cleared.
I've changed the map to a WeakHashMap and didn't see any issue during testing.
But I didn't measure footprint.
> src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java
> line 325:
>
>> 323:
>> 324: public int getFieldOffset(int index) {
>> 325: return (int)getField(index).getOffset();
>
> Cast to int is not needed
Other APIs (like MetadaField) are using longs to pass offsets, doing a cast
here is less disruptive than changing all the other APIs.
-------------
PR: https://git.openjdk.org/jdk/pull/12855