RFR: 8268406: Deallocate jmethodID native memory [v2]

David Holmes dholmes at openjdk.org
Tue Jun 17 03:22:30 UTC 2025


On Mon, 16 Jun 2025 17:37:17 GMT, Coleen Phillimore <coleenp at openjdk.org> wrote:

>> This change uses a ConcurrentHashTable to associate Method* with jmethodID, instead of an indirection.  JNI is deprecated in favor of using Panama to call methods, so I don't think we're concerned about JNI performance going forward.  JVMTI uses a lot of jmethodIDs but there aren't any performance tests for JVMTI, but running vmTestbase/nsk/jvmti with in product build with and without this change had no difference in time.
>> 
>> The purpose of this change is to remove the memory leak when you unload classes: we were leaving the jmethodID memory just in case JVMTI code still had references to that jmethodID and instead of crashing, should get nullptr.  With this change, if JVMTI looks up a jmethodID, we've removed it from the table and will return nullptr.  Redefinition and the InstanceKlass::_jmethod_method_ids is somewhat complicated.  When a method becomes "obsolete" in redefinition, which means that the code in the method is changed, afterward creating a jmethodID from an "obsolete" method will create a new entry in the InstanceKlass table.  This mechanism increases the method_idnum to do this.  In the future maybe we could throw NoSuchMethodError if you try to create a jmethodID out of an obsolete method and remove all this code.  But that's not in this change.
>> 
>> Tested with tier1-4, 5-7.
>
> Coleen Phillimore has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Fix formatting errors.

This looks good. I'm still digesting it.

Thanks

src/hotspot/share/oops/instanceKlass.cpp line 2480:

> 2478: void InstanceKlass::make_methods_jmethod_ids() {
> 2479:   MutexLocker ml(JmethodIdCreation_lock, Mutex::_no_safepoint_check_flag);
> 2480:   jmethodID* jmeths = methods_jmethod_ids_acquire();

Technically you don't need acquire semantics here as this value is not used to then access other data. But I see this is the only getter API available.

-------------

PR Review: https://git.openjdk.org/jdk/pull/25267#pullrequestreview-2933991535
PR Review Comment: https://git.openjdk.org/jdk/pull/25267#discussion_r2151221096


More information about the hotspot-dev mailing list