Skip to content

Commit a39ab22

Browse files
authored
Merge pull request #19225 from theresa-m/fix_18907_45
(0.45) Remove generated MHProxy package entries
2 parents 440a9f2 + 6b1781b commit a39ab22

File tree

4 files changed

+75
-1
lines changed

4 files changed

+75
-1
lines changed

runtime/oti/vm_api.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2120,6 +2120,15 @@ hashClassTableAtPut(J9VMThread *vmThread, J9ClassLoader *classLoader, U_8 *class
21202120
UDATA
21212121
hashClassTableDelete(J9ClassLoader *classLoader, U_8 *className, UDATA classNameLength);
21222122

2123+
/**
2124+
* @brief Remove package entry from hashClassTable
2125+
* @param *classLoader
2126+
* @param *romClass of package to be removed
2127+
* @return UDATA 0 on success, 1 on failure
2128+
*/
2129+
UDATA
2130+
hashClassTablePackageDelete(J9VMThread *vmThread, J9ClassLoader* classLoader, J9ROMClass* romClass);
2131+
21232132
/**
21242133
* @brief
21252134
* @param *javaVM

runtime/vm/KeyHashTable.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ static UDATA classLocationHashEqualFn(void *leftKey, void *rightKey, void *userD
5757

5858
static void addLocationGeneratedClass(J9VMThread *vmThread, J9ClassLoader *classLoader, KeyHashTableClassEntry *existingPackageEntry, IDATA entryIndex, I_32 locationType);
5959

60+
static BOOLEAN isMHProxyPackage(J9ROMClass *romClass);
61+
6062
#if defined(J9_EXTENDED_DEBUG)
6163
static void checkClassAlignment(J9Class *clazz, char const *caller)
6264
{
@@ -439,6 +441,28 @@ hashClassTableDelete(J9ClassLoader *classLoader, U_8 *className, UDATA className
439441
return hashTableRemove(table, &key);
440442
}
441443

444+
UDATA
445+
hashClassTablePackageDelete(J9VMThread *vmThread, J9ClassLoader* classLoader, J9ROMClass* romClass)
446+
{
447+
if (isMHProxyPackage(romClass)) {
448+
/* This generated package only exists for one hidden class and should be
449+
* removed when its rom class is unloaded. hashClassTable package id's rely
450+
* on there being a valid rom class.
451+
*/
452+
UDATA result = 0;
453+
KeyHashTableClassEntry key;
454+
key.tag = (UDATA)romClass | TAG_ROM_CLASS;
455+
omrthread_monitor_enter(vmThread->javaVM->classTableMutex);
456+
result = hashTableRemove(classLoader->classHashTable, &key);
457+
J9UTF8* className = J9ROMCLASS_CLASSNAME(romClass);
458+
Trc_VM_hashClassTablePackageDelete(vmThread, romClass, J9UTF8_LENGTH(className), J9UTF8_DATA(className));
459+
omrthread_monitor_exit(vmThread->javaVM->classTableMutex);
460+
return result;
461+
} else {
462+
return 0;
463+
}
464+
}
465+
442466
void
443467
hashClassTableReplace(J9VMThread *vmThread, J9ClassLoader *classLoader, J9Class *originalClass, J9Class *replacementClass)
444468
{
@@ -543,6 +567,16 @@ hashClassTableNextDo(J9HashTableState *walkState)
543567
return (NULL == next) ? NULL : next->ramClass;
544568
}
545569

570+
static BOOLEAN
571+
isMHProxyPackage(J9ROMClass *romClass) {
572+
const char* mhproxy = "jdk/MHProxy";
573+
/* Classes that are not strongly tied to the classloader will have
574+
* J9AccClassAnonClass set. See java.lang.invoke.MethodHandles
575+
*/
576+
return _J9ROMCLASS_J9MODIFIER_IS_SET(romClass, J9AccClassAnonClass) &&
577+
J9UTF8_LITERAL_EQUALS(J9UTF8_DATA(J9ROMCLASS_CLASSNAME(romClass)), sizeof(mhproxy) - 1, mhproxy);
578+
}
579+
546580
UDATA
547581
hashPkgTableIDFor(J9VMThread *vmThread, J9ClassLoader *classLoader, J9ROMClass *romClass, IDATA entryIndex, I_32 locationType)
548582
{
@@ -567,6 +601,16 @@ hashPkgTableIDFor(J9VMThread *vmThread, J9ClassLoader *classLoader, J9ROMClass *
567601
KeyHashTableClassEntry *result = NULL;
568602
BOOLEAN peekOnly = (J9_CP_INDEX_PEEK == entryIndex);
569603

604+
#if JAVA_SPEC_VERSION >= 22
605+
/* OpenJ9 issue 18907 fix rely's on this assertion.
606+
* Generated package names for hidden classes have a
607+
* one to one relationship with the generated class.
608+
*/
609+
if (isMHProxyPackage(romClass)) {
610+
Assert_VM_true(NULL == hashTableFind(table, &key));
611+
}
612+
#endif /* JAVA_SPEC_VERSION >= 22 */
613+
570614
if (peekOnly) {
571615
result = hashTableFind(table, &key);
572616
if (NULL == result) {

runtime/vm/j9vm.tdf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -964,3 +964,5 @@ TraceEvent=Trc_VM_criu_after_dump Obsolete Overhead=1 Level=2 Template="After ch
964964
TraceEvent=Trc_VM_crac_checkpointTo NoEnv Overhead=1 Level=3 Template="-XX:CRaCCheckpointTo=%s"
965965
TraceEvent=Trc_VM_criu_after_dump Overhead=1 Level=2 Template="After checkpoint criu_dump(), restoreNanoTimeMonotonic (%lld), lastRestoreTimeInNanoseconds (%lld)"
966966
TraceEvent=Trc_VM_criu_process_restore_start_after_dump Overhead=1 Level=2 Template="After checkpoint criu_dump(), restorePid (%zu), processRestoreStartTimeInNanoseconds (%lld)"
967+
968+
TraceEvent=Trc_VM_hashClassTablePackageDelete Overhead=1 Level=1 Template="hashClassTablePackageDelete %p (%.*s)"

runtime/vm/jvminit.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@ void sidecarExit(J9VMThread* shutdownThread);
233233
static jint runLoadStage (J9JavaVM *vm, IDATA flags);
234234
#if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
235235
static void freeClassNativeMemory (J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
236+
#if JAVA_SPEC_VERSION >= 22
237+
static void vmHookAnonClassesUnload(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
238+
#endif /* JAVA_SPEC_VERSION >= 22 */
236239
#endif /* GC_DYNAMIC_CLASS_UNLOADING */
237240
static jint runShutdownStage (J9JavaVM* vm, IDATA stage, void* reserved, UDATA filterFlags);
238241
static jint modifyDllLoadTable (J9JavaVM * vm, J9Pool* loadTable, J9VMInitArgs* j9vm_args);
@@ -7494,7 +7497,11 @@ protectedInitializeJavaVM(J9PortLibrary* portLibrary, void * userData)
74947497

74957498
#if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
74967499
vmHooks = getVMHookInterface(vm);
7497-
if(0 != (*vmHooks)->J9HookRegisterWithCallSite(vmHooks, J9HOOK_VM_CLASS_UNLOAD, freeClassNativeMemory, OMR_GET_CALLSITE(), NULL)) {
7500+
if(0 != (*vmHooks)->J9HookRegisterWithCallSite(vmHooks, J9HOOK_VM_CLASS_UNLOAD, freeClassNativeMemory, OMR_GET_CALLSITE(), NULL)
7501+
#if JAVA_SPEC_VERSION >= 22
7502+
|| 0 != (*vmHooks)->J9HookRegisterWithCallSite(vmHooks, J9HOOK_VM_ANON_CLASSES_UNLOAD, vmHookAnonClassesUnload, OMR_GET_CALLSITE(), NULL)
7503+
#endif /* JAVA_SPEC_VERSION >= 22 */
7504+
) {
74987505
goto error;
74997506
}
75007507
#endif
@@ -8115,6 +8122,18 @@ freeClassNativeMemory(J9HookInterface** hook, UDATA eventNum, void* eventData, v
81158122
#endif /* defined(J9VM_OPT_OPENJDK_METHODHANDLE) */
81168123
}
81178124

8125+
#if JAVA_SPEC_VERSION >= 22
8126+
static void
8127+
vmHookAnonClassesUnload(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
8128+
{
8129+
J9VMAnonymousClassesUnloadEvent * unloadedEvent = (J9VMAnonymousClassesUnloadEvent *)eventData;
8130+
J9VMThread * vmThread = unloadedEvent->currentThread;
8131+
for (J9Class* j9clazz = unloadedEvent->anonymousClassesToUnload; j9clazz; j9clazz = j9clazz->gcLink) {
8132+
hashClassTablePackageDelete(vmThread, j9clazz->classLoader, j9clazz->romClass);
8133+
}
8134+
}
8135+
#endif /* JAVA_SPEC_VERSION >= 22 */
8136+
81188137
#endif /* GC_DYNAMIC_CLASS_UNLOADING */
81198138

81208139
/**

0 commit comments

Comments
 (0)