If nmethods with "old" redefined Methods are saved in a table, this table can be walked instead of the entire code cache.
For Kitchensink, this seems to make a difference:
Before:
grep "cleanup live ClassLoaderData metaspaces" `find . -name gc.log`
[31.711s][1553115674958ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0118260 secs
[62.724s][1553115705971ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0427590 secs
[183.873s][1553115827120ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0178441 secs
[214.323s][1553115857570ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0281579 secs
[396.305s][1553116039552ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0171240 secs
[1245.064s][1553116888311ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0339398 secs
[1717.678s][1553117360925ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0223587 secs
[1760.353s][1553117403600ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0238709 secs
After:
grep "cleanup live ClassLoaderData metaspaces" `find . -name gc.log`
[30.268s][1553113535295ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0009381 secs
[568.405s][1553114073432ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0004220 secs
[577.033s][1553114082060ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0010892 secs
[819.540s][1553114324567ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0018096 secs
[1305.093s][1553114810120ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0008552 secs
[1625.169s][1553115130196ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0006562 secs
Long term plan is to make the cleanup outside the safepoint cleanup actions, and concurrent with ZGC with a handshake.
// Needs to be done single threaded by the VMThread. This walks
// the thread stacks looking for references to metadata before
// deciding to remove it from the metaspaces.
if (ClassLoaderDataGraph::should_clean_metaspaces_and_reset()) {
const char* name = "cleanup live ClassLoaderData metaspaces";
TraceTime timer(name, TRACETIME_LOG(Info, safepoint, cleanup));
ClassLoaderDataGraph::walk_metadata_and_clean_metaspaces();
}
For Kitchensink, this seems to make a difference:
Before:
grep "cleanup live ClassLoaderData metaspaces" `find . -name gc.log`
[31.711s][1553115674958ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0118260 secs
[62.724s][1553115705971ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0427590 secs
[183.873s][1553115827120ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0178441 secs
[214.323s][1553115857570ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0281579 secs
[396.305s][1553116039552ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0171240 secs
[1245.064s][1553116888311ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0339398 secs
[1717.678s][1553117360925ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0223587 secs
[1760.353s][1553117403600ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0238709 secs
After:
grep "cleanup live ClassLoaderData metaspaces" `find . -name gc.log`
[30.268s][1553113535295ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0009381 secs
[568.405s][1553114073432ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0004220 secs
[577.033s][1553114082060ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0010892 secs
[819.540s][1553114324567ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0018096 secs
[1305.093s][1553114810120ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0008552 secs
[1625.169s][1553115130196ms][info ][safepoint,cleanup ] cleanup live ClassLoaderData metaspaces, 0.0006562 secs
Long term plan is to make the cleanup outside the safepoint cleanup actions, and concurrent with ZGC with a handshake.
// Needs to be done single threaded by the VMThread. This walks
// the thread stacks looking for references to metadata before
// deciding to remove it from the metaspaces.
if (ClassLoaderDataGraph::should_clean_metaspaces_and_reset()) {
const char* name = "cleanup live ClassLoaderData metaspaces";
TraceTime timer(name, TRACETIME_LOG(Info, safepoint, cleanup));
ClassLoaderDataGraph::walk_metadata_and_clean_metaspaces();
}
- relates to
-
JDK-8225681 vmTestbase/nsk/jvmti/RedefineClasses/StressRedefine fails due to a) MT-unsafe modification of inline cache
-
- Resolved
-
-
JDK-8220512 Deoptimize redefinition functions that have dirty ICs
-
- Resolved
-
-
JDK-8226690 SIGSEGV in MetadataOnStackClosure::do_metadata
-
- Resolved
-
-
JDK-8242896 typo #ifdef INCLUDE_JVMTI in codeCache.cpp
-
- Resolved
-