Skip to content

Commit

Permalink
Merge pull request #19225 from theresa-m/fix_18907_45
Browse files Browse the repository at this point in the history
(0.45) Remove generated MHProxy package entries
  • Loading branch information
pshipton committed Mar 27, 2024
2 parents 440a9f2 + 6b1781b commit a39ab22
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 1 deletion.
9 changes: 9 additions & 0 deletions runtime/oti/vm_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -2120,6 +2120,15 @@ hashClassTableAtPut(J9VMThread *vmThread, J9ClassLoader *classLoader, U_8 *class
UDATA
hashClassTableDelete(J9ClassLoader *classLoader, U_8 *className, UDATA classNameLength);

/**
* @brief Remove package entry from hashClassTable
* @param *classLoader
* @param *romClass of package to be removed
* @return UDATA 0 on success, 1 on failure
*/
UDATA
hashClassTablePackageDelete(J9VMThread *vmThread, J9ClassLoader* classLoader, J9ROMClass* romClass);

/**
* @brief
* @param *javaVM
Expand Down
44 changes: 44 additions & 0 deletions runtime/vm/KeyHashTable.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ static UDATA classLocationHashEqualFn(void *leftKey, void *rightKey, void *userD

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

static BOOLEAN isMHProxyPackage(J9ROMClass *romClass);

#if defined(J9_EXTENDED_DEBUG)
static void checkClassAlignment(J9Class *clazz, char const *caller)
{
Expand Down Expand Up @@ -439,6 +441,28 @@ hashClassTableDelete(J9ClassLoader *classLoader, U_8 *className, UDATA className
return hashTableRemove(table, &key);
}

UDATA
hashClassTablePackageDelete(J9VMThread *vmThread, J9ClassLoader* classLoader, J9ROMClass* romClass)
{
if (isMHProxyPackage(romClass)) {
/* This generated package only exists for one hidden class and should be
* removed when its rom class is unloaded. hashClassTable package id's rely
* on there being a valid rom class.
*/
UDATA result = 0;
KeyHashTableClassEntry key;
key.tag = (UDATA)romClass | TAG_ROM_CLASS;
omrthread_monitor_enter(vmThread->javaVM->classTableMutex);
result = hashTableRemove(classLoader->classHashTable, &key);
J9UTF8* className = J9ROMCLASS_CLASSNAME(romClass);
Trc_VM_hashClassTablePackageDelete(vmThread, romClass, J9UTF8_LENGTH(className), J9UTF8_DATA(className));
omrthread_monitor_exit(vmThread->javaVM->classTableMutex);
return result;
} else {
return 0;
}
}

void
hashClassTableReplace(J9VMThread *vmThread, J9ClassLoader *classLoader, J9Class *originalClass, J9Class *replacementClass)
{
Expand Down Expand Up @@ -543,6 +567,16 @@ hashClassTableNextDo(J9HashTableState *walkState)
return (NULL == next) ? NULL : next->ramClass;
}

static BOOLEAN
isMHProxyPackage(J9ROMClass *romClass) {
const char* mhproxy = "jdk/MHProxy";
/* Classes that are not strongly tied to the classloader will have
* J9AccClassAnonClass set. See java.lang.invoke.MethodHandles
*/
return _J9ROMCLASS_J9MODIFIER_IS_SET(romClass, J9AccClassAnonClass) &&
J9UTF8_LITERAL_EQUALS(J9UTF8_DATA(J9ROMCLASS_CLASSNAME(romClass)), sizeof(mhproxy) - 1, mhproxy);
}

UDATA
hashPkgTableIDFor(J9VMThread *vmThread, J9ClassLoader *classLoader, J9ROMClass *romClass, IDATA entryIndex, I_32 locationType)
{
Expand All @@ -567,6 +601,16 @@ hashPkgTableIDFor(J9VMThread *vmThread, J9ClassLoader *classLoader, J9ROMClass *
KeyHashTableClassEntry *result = NULL;
BOOLEAN peekOnly = (J9_CP_INDEX_PEEK == entryIndex);

#if JAVA_SPEC_VERSION >= 22
/* OpenJ9 issue 18907 fix rely's on this assertion.
* Generated package names for hidden classes have a
* one to one relationship with the generated class.
*/
if (isMHProxyPackage(romClass)) {
Assert_VM_true(NULL == hashTableFind(table, &key));
}
#endif /* JAVA_SPEC_VERSION >= 22 */

if (peekOnly) {
result = hashTableFind(table, &key);
if (NULL == result) {
Expand Down
2 changes: 2 additions & 0 deletions runtime/vm/j9vm.tdf
Original file line number Diff line number Diff line change
Expand Up @@ -964,3 +964,5 @@ TraceEvent=Trc_VM_criu_after_dump Obsolete Overhead=1 Level=2 Template="After ch
TraceEvent=Trc_VM_crac_checkpointTo NoEnv Overhead=1 Level=3 Template="-XX:CRaCCheckpointTo=%s"
TraceEvent=Trc_VM_criu_after_dump Overhead=1 Level=2 Template="After checkpoint criu_dump(), restoreNanoTimeMonotonic (%lld), lastRestoreTimeInNanoseconds (%lld)"
TraceEvent=Trc_VM_criu_process_restore_start_after_dump Overhead=1 Level=2 Template="After checkpoint criu_dump(), restorePid (%zu), processRestoreStartTimeInNanoseconds (%lld)"

TraceEvent=Trc_VM_hashClassTablePackageDelete Overhead=1 Level=1 Template="hashClassTablePackageDelete %p (%.*s)"
21 changes: 20 additions & 1 deletion runtime/vm/jvminit.c
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,9 @@ void sidecarExit(J9VMThread* shutdownThread);
static jint runLoadStage (J9JavaVM *vm, IDATA flags);
#if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
static void freeClassNativeMemory (J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
#if JAVA_SPEC_VERSION >= 22
static void vmHookAnonClassesUnload(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
#endif /* JAVA_SPEC_VERSION >= 22 */
#endif /* GC_DYNAMIC_CLASS_UNLOADING */
static jint runShutdownStage (J9JavaVM* vm, IDATA stage, void* reserved, UDATA filterFlags);
static jint modifyDllLoadTable (J9JavaVM * vm, J9Pool* loadTable, J9VMInitArgs* j9vm_args);
Expand Down Expand Up @@ -7494,7 +7497,11 @@ protectedInitializeJavaVM(J9PortLibrary* portLibrary, void * userData)

#if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
vmHooks = getVMHookInterface(vm);
if(0 != (*vmHooks)->J9HookRegisterWithCallSite(vmHooks, J9HOOK_VM_CLASS_UNLOAD, freeClassNativeMemory, OMR_GET_CALLSITE(), NULL)) {
if(0 != (*vmHooks)->J9HookRegisterWithCallSite(vmHooks, J9HOOK_VM_CLASS_UNLOAD, freeClassNativeMemory, OMR_GET_CALLSITE(), NULL)
#if JAVA_SPEC_VERSION >= 22
|| 0 != (*vmHooks)->J9HookRegisterWithCallSite(vmHooks, J9HOOK_VM_ANON_CLASSES_UNLOAD, vmHookAnonClassesUnload, OMR_GET_CALLSITE(), NULL)
#endif /* JAVA_SPEC_VERSION >= 22 */
) {
goto error;
}
#endif
Expand Down Expand Up @@ -8115,6 +8122,18 @@ freeClassNativeMemory(J9HookInterface** hook, UDATA eventNum, void* eventData, v
#endif /* defined(J9VM_OPT_OPENJDK_METHODHANDLE) */
}

#if JAVA_SPEC_VERSION >= 22
static void
vmHookAnonClassesUnload(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
{
J9VMAnonymousClassesUnloadEvent * unloadedEvent = (J9VMAnonymousClassesUnloadEvent *)eventData;
J9VMThread * vmThread = unloadedEvent->currentThread;
for (J9Class* j9clazz = unloadedEvent->anonymousClassesToUnload; j9clazz; j9clazz = j9clazz->gcLink) {
hashClassTablePackageDelete(vmThread, j9clazz->classLoader, j9clazz->romClass);
}
}
#endif /* JAVA_SPEC_VERSION >= 22 */

#endif /* GC_DYNAMIC_CLASS_UNLOADING */

/**
Expand Down

0 comments on commit a39ab22

Please sign in to comment.