Path: blob/master/runtime/gc_verbose_handler_vlhgc/VerboseHandlerOutputVLHGC.cpp
5986 views
/*******************************************************************************1* Copyright (c) 1991, 2021 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception20*******************************************************************************/2122#include "VerboseHandlerOutputVLHGC.hpp"2324#include "CollectionStatisticsVLHGC.hpp"25#include "ConcurrentPhaseStatsBase.hpp"26#include "CopyForwardStats.hpp"27#include "CycleStateVLHGC.hpp"28#include "EnvironmentBase.hpp"29#include "GCExtensions.hpp"30#include "MarkVLHGCStats.hpp"31#include "ReferenceStats.hpp"32#include "VerboseManager.hpp"33#include "VerboseWriterChain.hpp"34#include "VerboseHandlerJava.hpp"3536#include "mmhook.h"3738static void verboseHandlerGCStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);39static void verboseHandlerGCEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);40static void verboseHandlerTaxationEntryPoint(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);41static void verboseHandlerCycleStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);42static void verboseHandlerCycleContinue(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);43static void verboseHandlerCycleEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);44static void verboseHandlerExclusiveStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);45static void verboseHandlerExclusiveEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);46static void verboseHandlerSystemGCStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);47static void verboseHandlerSystemGCEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);48static void verboseHandlerAllocationFailureStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);49static void verboseHandlerFailedAllocationCompleted(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);50static void verboseHandlerAllocationFailureEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);51static void verboseHandlerCopyForwardStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);52static void verboseHandlerCopyForwardEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);53static void verboseHandlerConcurrentStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);54static void verboseHandlerConcurrentEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);55static void verboseHandlerGMPMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);56static void verboseHandlerGMPMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);57static void verboseHandlerGlobalGCMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);58static void verboseHandlerGlobalGCMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);59static void verboseHandlerPGCMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);60static void verboseHandlerPGCMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);61static void verboseHandlerReclaimSweepStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);62static void verboseHandlerReclaimSweepEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);63static void verboseHandlerReclaimCompactStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);64static void verboseHandlerReclaimCompactEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);65static void verboseHandlerExcessiveGCRaised(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);66static void verboseHandlerAcquiredExclusiveToSatisfyAllocation(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);67static void verboseHandlerClassUnloadingEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);6869MM_VerboseHandlerOutput *70MM_VerboseHandlerOutputVLHGC::newInstance(MM_EnvironmentBase *env, MM_VerboseManager *manager)71{72MM_GCExtensions* extensions = MM_GCExtensions::getExtensions(env->getOmrVM());7374MM_VerboseHandlerOutputVLHGC *verboseHandlerOutput = (MM_VerboseHandlerOutputVLHGC *)extensions->getForge()->allocate(sizeof(MM_VerboseHandlerOutputVLHGC), MM_AllocationCategory::FIXED, J9_GET_CALLSITE());75if (NULL != verboseHandlerOutput) {76new(verboseHandlerOutput) MM_VerboseHandlerOutputVLHGC(extensions);77if(!verboseHandlerOutput->initialize(env, manager)) {78verboseHandlerOutput->kill(env);79verboseHandlerOutput = NULL;80}81}82return verboseHandlerOutput;83}8485bool86MM_VerboseHandlerOutputVLHGC::initialize(MM_EnvironmentBase *env, MM_VerboseManager *manager)87{88bool initSuccess = MM_VerboseHandlerOutput::initialize(env, manager);8990_mmHooks = J9_HOOK_INTERFACE(MM_GCExtensions::getExtensions(_extensions)->hookInterface);9192return initSuccess;93}9495void96MM_VerboseHandlerOutputVLHGC::tearDown(MM_EnvironmentBase *env)97{98MM_VerboseHandlerOutput::tearDown(env);99}100101void102MM_VerboseHandlerOutputVLHGC::enableVerbose()103{104MM_VerboseHandlerOutput::enableVerbose();105106/* GCLaunch */107(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SYSTEM_GC_START, verboseHandlerSystemGCStart, OMR_GET_CALLSITE(), (void *)this);108(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SYSTEM_GC_END, verboseHandlerSystemGCEnd, OMR_GET_CALLSITE(), (void *)this);109(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ALLOCATION_FAILURE_START, verboseHandlerAllocationFailureStart, OMR_GET_CALLSITE(), (void *)this);110(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_FAILED_ALLOCATION_COMPLETED, verboseHandlerFailedAllocationCompleted, OMR_GET_CALLSITE(), (void *)this);111(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ALLOCATION_FAILURE_END, verboseHandlerAllocationFailureEnd, OMR_GET_CALLSITE(), (void *)this);112(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_TAROK_INCREMENT_START, verboseHandlerTaxationEntryPoint, OMR_GET_CALLSITE(), (void *)this);113114/* Exclusive */115(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_EXCLUSIVE_ACCESS_ACQUIRE, verboseHandlerExclusiveStart, OMR_GET_CALLSITE(), (void *)this);116(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_EXCLUSIVE_ACCESS_RELEASE, verboseHandlerExclusiveEnd, OMR_GET_CALLSITE(), (void *)this);117(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ACQUIRED_EXCLUSIVE_TO_SATISFY_ALLOCATION, verboseHandlerAcquiredExclusiveToSatisfyAllocation, OMR_GET_CALLSITE(), (void *)this);118119/* STW GC increment */120(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_INCREMENT_START, verboseHandlerGCStart, OMR_GET_CALLSITE(), (void *)this);121(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_INCREMENT_END, verboseHandlerGCEnd, OMR_GET_CALLSITE(), (void *)this);122123/* Cycle */124(*_mmOmrHooks)->J9HookRegisterWithCallSite(_mmOmrHooks, J9HOOK_MM_OMR_GC_CYCLE_START, verboseHandlerCycleStart, OMR_GET_CALLSITE(), (void *)this);125(*_mmOmrHooks)->J9HookRegisterWithCallSite(_mmOmrHooks, J9HOOK_MM_OMR_GC_CYCLE_CONTINUE, verboseHandlerCycleContinue, OMR_GET_CALLSITE(), (void *)this);126(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_POST_CYCLE_END, verboseHandlerCycleEnd, OMR_GET_CALLSITE(), (void *)this);127128/* Mark */129(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GMP_MARK_START, verboseHandlerGMPMarkStart, OMR_GET_CALLSITE(), (void *)this);130(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GMP_MARK_END, verboseHandlerGMPMarkEnd, OMR_GET_CALLSITE(), (void *)this);131(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_VLHGC_GLOBAL_GC_MARK_START, verboseHandlerGlobalGCMarkStart, OMR_GET_CALLSITE(), (void *)this);132(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_VLHGC_GLOBAL_GC_MARK_END, verboseHandlerGlobalGCMarkEnd, OMR_GET_CALLSITE(), (void *)this);133(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_PGC_MARK_START, verboseHandlerPGCMarkStart, OMR_GET_CALLSITE(), (void *)this);134(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_PGC_MARK_END, verboseHandlerPGCMarkEnd, OMR_GET_CALLSITE(), (void *)this);135136/* Sweep */137(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_SWEEP_START, verboseHandlerReclaimSweepStart, OMR_GET_CALLSITE(), (void *)this);138(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_SWEEP_END, verboseHandlerReclaimSweepEnd, OMR_GET_CALLSITE(), (void *)this);139140/* Compact */141(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_COMPACT_START, verboseHandlerReclaimCompactStart, OMR_GET_CALLSITE(), (void *)this);142(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_COMPACT_END, verboseHandlerReclaimCompactEnd, OMR_GET_CALLSITE(), (void *)this);143144/* Copy Forward */145(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COPY_FORWARD_START, verboseHandlerCopyForwardStart, OMR_GET_CALLSITE(), (void *)this);146(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COPY_FORWARD_END, verboseHandlerCopyForwardEnd, OMR_GET_CALLSITE(), (void *)this);147148/* Concurrent GMP */149(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_PHASE_START, verboseHandlerConcurrentStart, OMR_GET_CALLSITE(), this);150(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_PHASE_END, verboseHandlerConcurrentEnd, OMR_GET_CALLSITE(), this);151152/* Excessive GC */153(*_mmOmrHooks)->J9HookRegisterWithCallSite(_mmOmrHooks, J9HOOK_MM_OMR_EXCESSIVEGC_RAISED, verboseHandlerExcessiveGCRaised, OMR_GET_CALLSITE(), this);154155#if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)156(*_mmHooks)->J9HookRegisterWithCallSite(_mmHooks, J9HOOK_MM_CLASS_UNLOADING_END, verboseHandlerClassUnloadingEnd, OMR_GET_CALLSITE(), (void *)this);157#endif /* defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING) */158}159160void161MM_VerboseHandlerOutputVLHGC::disableVerbose()162{163MM_VerboseHandlerOutput::disableVerbose();164165/* GCLaunch */166(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SYSTEM_GC_START, verboseHandlerSystemGCStart, NULL);167(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SYSTEM_GC_END, verboseHandlerSystemGCEnd, NULL);168(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ALLOCATION_FAILURE_START, verboseHandlerAllocationFailureStart, NULL);169(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_FAILED_ALLOCATION_COMPLETED, verboseHandlerFailedAllocationCompleted, NULL);170(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ALLOCATION_FAILURE_END, verboseHandlerAllocationFailureEnd, NULL);171(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_TAROK_INCREMENT_START, verboseHandlerTaxationEntryPoint, NULL);172173/* Cycle */174(*_mmOmrHooks)->J9HookUnregister(_mmOmrHooks, J9HOOK_MM_OMR_GC_CYCLE_START, verboseHandlerCycleStart, NULL);175(*_mmOmrHooks)->J9HookUnregister(_mmOmrHooks, J9HOOK_MM_OMR_GC_CYCLE_CONTINUE, verboseHandlerCycleContinue, NULL);176(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_POST_CYCLE_END, verboseHandlerCycleEnd, NULL);177178/* STW GC increment */179(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_INCREMENT_START, verboseHandlerGCStart, NULL);180(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_INCREMENT_END, verboseHandlerGCEnd, NULL);181182/* Exclusive */183(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_EXCLUSIVE_ACCESS_ACQUIRE, verboseHandlerExclusiveStart, NULL);184(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_EXCLUSIVE_ACCESS_RELEASE, verboseHandlerExclusiveEnd, NULL);185(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ACQUIRED_EXCLUSIVE_TO_SATISFY_ALLOCATION, verboseHandlerAcquiredExclusiveToSatisfyAllocation, NULL);186187/* Mark */188(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GMP_MARK_START, verboseHandlerGMPMarkStart, NULL);189(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GMP_MARK_END, verboseHandlerGMPMarkEnd, NULL);190(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_VLHGC_GLOBAL_GC_MARK_START, verboseHandlerGlobalGCMarkStart, NULL);191(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_VLHGC_GLOBAL_GC_MARK_END, verboseHandlerGlobalGCMarkEnd, NULL);192(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_PGC_MARK_START, verboseHandlerPGCMarkStart, NULL);193(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_PGC_MARK_END, verboseHandlerPGCMarkEnd, NULL);194195/* Sweep */196(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_SWEEP_START, verboseHandlerReclaimSweepStart, NULL);197(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_SWEEP_END, verboseHandlerReclaimSweepEnd, NULL);198199/* Compact */200(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_COMPACT_START, verboseHandlerReclaimCompactStart, NULL);201(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_COMPACT_END, verboseHandlerReclaimCompactEnd, NULL);202203/* Copy Forward */204(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COPY_FORWARD_START, verboseHandlerCopyForwardStart, NULL);205(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COPY_FORWARD_END, verboseHandlerCopyForwardEnd, NULL);206207/* Concurrent GMP */208(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_PHASE_START, verboseHandlerConcurrentStart, NULL);209(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_PHASE_END, verboseHandlerConcurrentEnd, NULL);210211/* Excessive GC */212(*_mmOmrHooks)->J9HookUnregister(_mmOmrHooks, J9HOOK_MM_OMR_EXCESSIVEGC_RAISED, verboseHandlerExcessiveGCRaised, NULL);213214#if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)215(*_mmHooks)->J9HookUnregister(_mmHooks, J9HOOK_MM_CLASS_UNLOADING_END, verboseHandlerClassUnloadingEnd, NULL);216#endif /* defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING) */217}218219bool220MM_VerboseHandlerOutputVLHGC::getThreadName(char *buf, UDATA bufLen, OMR_VMThread *vmThread)221{222return MM_VerboseHandlerJava::getThreadName(buf,bufLen,vmThread);223}224225void226MM_VerboseHandlerOutputVLHGC::writeVmArgs(MM_EnvironmentBase* env, MM_VerboseBuffer* buffer)227{228MM_VerboseHandlerJava::writeVmArgs(env, buffer, static_cast<J9JavaVM*>(_omrVM->_language_vm));229}230231void232MM_VerboseHandlerOutputVLHGC::handleTaxationEntryPoint(J9HookInterface** hook, UDATA eventNum, void* eventData)233{234MM_TarokIncrementStartEvent* event = (MM_TarokIncrementStartEvent*)eventData;235MM_VerboseManager* manager = getManager();236MM_VerboseWriterChain* writer = manager->getWriterChain();237MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);238PORT_ACCESS_FROM_ENVIRONMENT(env);239U_64 currentTime = event->timestamp;240U_64 previousTime = manager->getLastTaxationEntryPointTime();241manager->setLastTaxationEntryPointTime(currentTime);242if (0 == previousTime) {243previousTime = manager->getInitializedTime();244}245U_64 deltaTime = 0;246bool deltaTimeSuccess = getTimeDeltaInMicroSeconds(&deltaTime, previousTime, currentTime);247248char tagTemplate[200];249getTagTemplate(tagTemplate, sizeof(tagTemplate), j9time_current_time_millis());250enterAtomicReportingBlock();251if (!deltaTimeSuccess) {252writer->formatAndOutput(env, 0, "<warning details=\"clock error detected, following timing may be inaccurate\" />");253}254writer->formatAndOutput(env, 0, "<allocation-taxation id=\"%zu\" taxation-threshold=\"%zu\" %s intervalms=\"%llu.%03llu\" />", manager->getIdAndIncrement(), event->taxationThreshold, tagTemplate, deltaTime / 1000 , deltaTime % 1000);255writer->flush(env);256exitAtomicReportingBlock();257}258259void260MM_VerboseHandlerOutputVLHGC::outputUnfinalizedInfo(MM_EnvironmentBase *env, UDATA indent, UDATA unfinalizedCandidates, UDATA unfinalizedEnqueued)261{262if(0 != unfinalizedCandidates) {263_manager->getWriterChain()->formatAndOutput(env, indent, "<finalization candidates=\"%zu\" enqueued=\"%zu\" />", unfinalizedCandidates, unfinalizedEnqueued);264}265}266267void268MM_VerboseHandlerOutputVLHGC::outputOwnableSynchronizerInfo(MM_EnvironmentBase *env, UDATA indent, UDATA ownableSynchronizerCandidates, UDATA ownableSynchronizerCleared)269{270if (0 != ownableSynchronizerCandidates) {271_manager->getWriterChain()->formatAndOutput(env, indent, "<ownableSynchronizers candidates=\"%zu\" cleared=\"%zu\" />", ownableSynchronizerCandidates, ownableSynchronizerCleared);272}273}274275void276MM_VerboseHandlerOutputVLHGC::outputReferenceInfo(MM_EnvironmentBase *env, UDATA indent, const char *referenceType, MM_ReferenceStats *referenceStats, UDATA dynamicThreshold, UDATA maxThreshold)277{278if(0 != referenceStats->_candidates) {279if (0 != maxThreshold) {280_manager->getWriterChain()->formatAndOutput(env, indent, "<references type=\"%s\" candidates=\"%zu\" cleared=\"%zu\" enqueued=\"%zu\" dynamicThreshold=\"%zu\" maxThreshold=\"%zu\" />",281referenceType, referenceStats->_candidates, referenceStats->_cleared, referenceStats->_enqueued, dynamicThreshold, maxThreshold);282} else {283_manager->getWriterChain()->formatAndOutput(env, indent, "<references type=\"%s\" candidates=\"%zu\" cleared=\"%zu\" enqueued=\"%zu\" />",284referenceType, referenceStats->_candidates, referenceStats->_cleared, referenceStats->_enqueued);285}286}287}288289void290MM_VerboseHandlerOutputVLHGC::outputInitializedInnerStanza(MM_EnvironmentBase *env, MM_VerboseBuffer *buffer){291outputInitializedRegion(env, buffer);292}293294void295MM_VerboseHandlerOutputVLHGC::printAllocationStats(MM_EnvironmentBase* env)296{297if (MM_CycleState::CT_GLOBAL_MARK_PHASE != env->_cycleState->_collectionType) {298MM_VerboseHandlerOutput::printAllocationStats(env);299}300}301302bool303MM_VerboseHandlerOutputVLHGC::hasOutputMemoryInfoInnerStanza()304{305return true;306}307308const char *309MM_VerboseHandlerOutputVLHGC::getSubSpaceType(uintptr_t typeFlags)310{311const char *subSpaceType = NULL;312if (MEMORY_TYPE_NEW == typeFlags) {313subSpaceType = "eden";314} else {315subSpaceType = "total heap";316}317return subSpaceType;318}319320void321MM_VerboseHandlerOutputVLHGC::outputMemoryInfoInnerStanza(MM_EnvironmentBase *env, UDATA indent, MM_CollectionStatistics *statsBase)322{323MM_VerboseWriterChain* writer = _manager->getWriterChain();324MM_CollectionStatisticsVLHGC *stats = MM_CollectionStatisticsVLHGC::getCollectionStatistics(statsBase);325326if (0 != stats->_edenHeapSize) {327writer->formatAndOutput(env, indent, "<mem type=\"eden\" free=\"%zu\" total=\"%zu\" percent=\"%zu\" />",328stats->_edenFreeHeapSize, stats->_edenHeapSize,329((UDATA)(((U_64)stats->_edenFreeHeapSize*100) / (U_64)stats->_edenHeapSize)));330}331332if (0 != stats->_arrayletReferenceObjects) {333writer->formatAndOutput(env, indent, "<arraylet-reference objects=\"%zu\" leaves=\"%zu\" largest=\"%zu\" />",334stats->_arrayletReferenceObjects, stats->_arrayletReferenceLeaves, stats->_largestReferenceArraylet);335}336if (0 != stats->_arrayletPrimitiveObjects) {337writer->formatAndOutput(env, indent, "<arraylet-primitive objects=\"%zu\" leaves=\"%zu\" largest=\"%zu\" />",338stats->_arrayletPrimitiveObjects, stats->_arrayletPrimitiveLeaves, stats->_largestPrimitiveArraylet);339}340if (0 != stats->_arrayletUnknownObjects) {341writer->formatAndOutput(env, indent, "<arraylet-unknown objects=\"%zu\" leaves=\"%zu\" />",342stats->_arrayletUnknownObjects, stats->_arrayletUnknownLeaves);343}344345if (0 != stats->_numaNodes) {346UDATA total = stats->_commonNumaNodeBytes + stats->_localNumaNodeBytes + stats->_nonLocalNumaNodeBytes;347UDATA nonLocalPercent = 0;348if (0 != total) {349nonLocalPercent = (UDATA)((100 * (U_64)stats->_nonLocalNumaNodeBytes) / ((U_64)total));350}351writer->formatAndOutput(env, indent, "<numa common=\"%zu\" local=\"%zu\" non-local=\"%zu\" non-local-percent=\"%zu\" />",352stats->_commonNumaNodeBytes, stats->_localNumaNodeBytes, stats->_nonLocalNumaNodeBytes, nonLocalPercent);353}354355MM_VerboseHandlerJava::outputFinalizableInfo(_manager, env, indent);356357UDATA rememberedSetFreePercent = (UDATA)((100 * (U_64)stats->_rememberedSetBytesFree) / ((U_64)stats->_rememberedSetBytesTotal));358359writer->formatAndOutput(env, indent, "<remembered-set count=\"%zu\" freebytes=\"%zu\" totalbytes=\"%zu\" percent=\"%zu\" regionsoverflowed=\"%zu\" regionsstable=\"%zu\" regionsrebuilding=\"%zu\"/>",360stats->_rememberedSetCount, stats->_rememberedSetBytesFree, stats->_rememberedSetBytesTotal, rememberedSetFreePercent,361stats->_rememberedSetOverflowedRegionCount, stats->_rememberedSetStableRegionCount, stats->_rememberedSetBeingRebuiltRegionCount);362}363364void365MM_VerboseHandlerOutputVLHGC::outputRememberedSetClearedInfo(MM_EnvironmentBase *env, MM_InterRegionRememberedSetStats *irrsStats)366{367_manager->getWriterChain()->formatAndOutput(env, 1, "<remembered-set-cleared processed=\"%zu\" cleared=\"%zu\" durationms=\"%llu.%03.3llu\" />",368irrsStats->_clearFromRegionReferencesCardsProcessed,369irrsStats->_clearFromRegionReferencesCardsCleared,370irrsStats->_clearFromRegionReferencesTimesus / 1000, irrsStats->_clearFromRegionReferencesTimesus % 1000);371}372373void374MM_VerboseHandlerOutputVLHGC::handleCopyForwardStart(J9HookInterface** hook, UDATA eventNum, void* eventData)375{376}377378void379MM_VerboseHandlerOutputVLHGC::handleCopyForwardEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)380{381MM_CopyForwardEndEvent * event = (MM_CopyForwardEndEvent *)eventData;382MM_VerboseWriterChain* writer = _manager->getWriterChain();383MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);384MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(env->getOmrVM());385MM_CopyForwardStats *copyForwardStats = (MM_CopyForwardStats *)event->copyForwardStats;386MM_WorkPacketStats *workPacketStats = (MM_WorkPacketStats *)event->workPacketStats;387MM_InterRegionRememberedSetStats *irrsStats = (MM_InterRegionRememberedSetStats *)event->irrsStats;388PORT_ACCESS_FROM_ENVIRONMENT(env);389U_64 totalTime = 0;390bool totalTimeSuccess = getTimeDeltaInMicroSeconds(&totalTime, copyForwardStats->_startTime, copyForwardStats->_endTime);391392char tagTemplate[200];393getTagTemplate(tagTemplate, sizeof(tagTemplate), _manager->getIdAndIncrement(), "copy forward", env->_cycleState->_verboseContextID, totalTime, j9time_current_time_millis());394enterAtomicReportingBlock();395if (!totalTimeSuccess) {396writer->formatAndOutput(env, 0, "<warning details=\"clock error detected, following timing may be inaccurate\" />");397}398writer->formatAndOutput(env, 0, "<gc-op %s>", tagTemplate);399400writer->formatAndOutput(env, 1, "<memory-copied type=\"eden\" objects=\"%zu\" bytes=\"%zu\" bytesdiscarded=\"%zu\" />",401copyForwardStats->_copyObjectsEden, copyForwardStats->_copyBytesEden, copyForwardStats->_copyDiscardBytesEden);402writer->formatAndOutput(env, 1, "<memory-copied type=\"other\" objects=\"%zu\" bytes=\"%zu\" bytesdiscarded=\"%zu\" />",403copyForwardStats->_copyObjectsNonEden, copyForwardStats->_copyBytesNonEden, copyForwardStats->_copyDiscardBytesNonEden);404writer->formatAndOutput(env, 1, "<memory-cardclean objects=\"%zu\" bytes=\"%zu\" />",405copyForwardStats->_objectsCardClean, copyForwardStats->_bytesCardClean);406if(copyForwardStats->_aborted || (0 != copyForwardStats->_nonEvacuateRegionCount)) {407writer->formatAndOutput(env, 1, "<memory-traced type=\"eden\" objects=\"%zu\" bytes=\"%zu\" />",408copyForwardStats->_scanObjectsEden, copyForwardStats->_scanBytesEden);409writer->formatAndOutput(env, 1, "<memory-traced type=\"other\" objects=\"%zu\" bytes=\"%zu\" />",410copyForwardStats->_scanObjectsNonEden, copyForwardStats->_scanBytesNonEden);411}412if (0 == copyForwardStats->_nonEvacuateRegionCount) {413writer->formatAndOutput(env, 1, "<regions eden=\"%zu\" other=\"%zu\" />",414copyForwardStats->_edenEvacuateRegionCount, copyForwardStats->_nonEdenEvacuateRegionCount);415} else {416writer->formatAndOutput(env, 1, "<regions eden=\"%zu\" other=\"%zu\" evacuated=\"%zu\" marked=\"%zu\" />",417copyForwardStats->_edenEvacuateRegionCount, copyForwardStats->_nonEdenEvacuateRegionCount,418(copyForwardStats->_edenEvacuateRegionCount + copyForwardStats->_nonEdenEvacuateRegionCount - copyForwardStats->_nonEvacuateRegionCount),419copyForwardStats->_nonEvacuateRegionCount);420}421outputRememberedSetClearedInfo(env, irrsStats);422423outputUnfinalizedInfo(env, 1, copyForwardStats->_unfinalizedCandidates, copyForwardStats->_unfinalizedEnqueued);424outputOwnableSynchronizerInfo(env, 1, copyForwardStats->_ownableSynchronizerCandidates, (copyForwardStats->_ownableSynchronizerCandidates-copyForwardStats->_ownableSynchronizerSurvived));425426outputReferenceInfo(env, 1, "soft", ©ForwardStats->_softReferenceStats, extensions->getDynamicMaxSoftReferenceAge(), extensions->getMaxSoftReferenceAge());427outputReferenceInfo(env, 1, "weak", ©ForwardStats->_weakReferenceStats, 0, 0);428outputReferenceInfo(env, 1, "phantom", ©ForwardStats->_phantomReferenceStats, 0, 0);429430outputStringConstantInfo(env, 1, copyForwardStats->_stringConstantsCandidates, copyForwardStats->_stringConstantsCleared);431outputMonitorReferenceInfo(env, 1, copyForwardStats->_monitorReferenceCandidates, copyForwardStats->_monitorReferenceCleared);432433if(0 != copyForwardStats->_heapExpandedCount) {434U_64 expansionMicros = j9time_hires_delta(0, copyForwardStats->_heapExpandedTime, J9PORT_TIME_DELTA_IN_MICROSECONDS);435outputCollectorHeapResizeInfo(env, 1, HEAP_EXPAND, copyForwardStats->_heapExpandedBytes, copyForwardStats->_heapExpandedCount, MEMORY_TYPE_OLD, SATISFY_COLLECTOR, expansionMicros);436}437438if(copyForwardStats->_scanCacheOverflow) {439writer->formatAndOutput(env, 1, "<warning details=\"scan cache overflow (storage acquired from heap)\" />");440}441442if(copyForwardStats->_aborted) {443writer->formatAndOutput(env, 1, "<warning details=\"operation aborted due to insufficient free space\" />");444}445446if(workPacketStats->getSTWWorkStackOverflowOccured()) {447writer->formatAndOutput(env, 1, "<warning details=\"work packet overflow\" count=\"%zu\" packetcount=\"%zu\" />",448workPacketStats->getSTWWorkStackOverflowCount(), workPacketStats->getSTWWorkpacketCountAtOverflow());449}450451writer->formatAndOutput(env, 0, "</gc-op>");452writer->flush(env);453exitAtomicReportingBlock();454}455456void457MM_VerboseHandlerOutputVLHGC::handleConcurrentStartInternal(J9HookInterface** hook, UDATA eventNum, void* eventData)458{459MM_ConcurrentPhaseEndEvent *event = (MM_ConcurrentPhaseEndEvent *)eventData;460MM_ConcurrentPhaseStatsBase *stats = (MM_ConcurrentPhaseStatsBase *)event->concurrentStats;461MM_VerboseWriterChain* writer = _manager->getWriterChain();462MM_EnvironmentBase *env = MM_EnvironmentBase::getEnvironment(event->currentThread);463464writer->formatAndOutput(env, 1, "<concurrent-mark-start scanTarget=\"%zu\" />", stats->_scanTargetInBytes);465}466467void468MM_VerboseHandlerOutputVLHGC::handleConcurrentEndInternal(J9HookInterface** hook, UDATA eventNum, void* eventData)469{470MM_ConcurrentPhaseEndEvent *event = (MM_ConcurrentPhaseEndEvent *)eventData;471MM_ConcurrentPhaseStatsBase *stats = (MM_ConcurrentPhaseStatsBase *)event->concurrentStats;472MM_VerboseWriterChain* writer = _manager->getWriterChain();473MM_EnvironmentBase *env = MM_EnvironmentBase::getEnvironment(event->currentThread);474475uint64_t duration = 0;476MM_MarkVLHGCStats *markStats = &static_cast<MM_CycleStateVLHGC*>(env->_cycleState)->_vlhgcIncrementStats._markStats;477bool deltaTimeSuccess = getTimeDeltaInMicroSeconds(&duration, markStats->_startTime, markStats->_endTime);478479handleGCOPOuterStanzaStart(env, "mark increment", stats->_cycleID, duration, deltaTimeSuccess);480481UDATA bytesScanned = stats->_bytesScanned;482writer->formatAndOutput(env, 1, "<trace-info scanbytes=\"%zu\" />", bytesScanned);483handleGCOPOuterStanzaEnd(env);484}485486void487MM_VerboseHandlerOutputVLHGC::handleGMPMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData)488{489/* No implementation */490}491492void493MM_VerboseHandlerOutputVLHGC::handleGMPMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)494{495MM_GMPMarkEndEvent * event = (MM_GMPMarkEndEvent *)eventData;496MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);497MM_MarkVLHGCStats *markStats = (MM_MarkVLHGCStats *)event->markStats;498MM_WorkPacketStats *workPacketStats = (MM_WorkPacketStats *)event->workPacketStats;499500outputMarkSummary(env, "mark increment", markStats, workPacketStats, NULL);501}502503void504MM_VerboseHandlerOutputVLHGC::handleGlobalGCMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData)505{506/* No implementation */507}508509void510MM_VerboseHandlerOutputVLHGC::handleGlobalGCMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)511{512MM_VLHGCGlobalGCMarkEndEvent * event = (MM_VLHGCGlobalGCMarkEndEvent *)eventData;513MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);514MM_MarkVLHGCStats *markStats = (MM_MarkVLHGCStats *)event->markStats;515MM_WorkPacketStats *workPacketStats = (MM_WorkPacketStats *)event->workPacketStats;516517outputMarkSummary(env, "global mark", markStats, workPacketStats, NULL);518}519520void521MM_VerboseHandlerOutputVLHGC::handlePGCMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData)522{523/* No implementation */524}525526void527MM_VerboseHandlerOutputVLHGC::handlePGCMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)528{529MM_PGCMarkEndEvent * event = (MM_PGCMarkEndEvent *)eventData;530MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);531MM_MarkVLHGCStats *markStats = (MM_MarkVLHGCStats *)event->markStats;532MM_WorkPacketStats *workPacketStats = (MM_WorkPacketStats *)event->workPacketStats;533MM_InterRegionRememberedSetStats *irrsStats = (MM_InterRegionRememberedSetStats *)event->irrsStats;534535outputMarkSummary(env, "mark", markStats, workPacketStats, irrsStats);536}537538void539MM_VerboseHandlerOutputVLHGC::outputMarkSummary(MM_EnvironmentBase *env, const char *markType, MM_MarkVLHGCStats *markStats, MM_WorkPacketStats *workPacketStats, MM_InterRegionRememberedSetStats *irrsStats)540{541MM_VerboseWriterChain* writer = _manager->getWriterChain();542MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(env->getOmrVM());543544PORT_ACCESS_FROM_ENVIRONMENT(env);545546U_64 totalTime = 0;547bool totalTimeSuccess = getTimeDeltaInMicroSeconds(&totalTime, markStats->_startTime, markStats->_endTime);548549char tagTemplate[200];550getTagTemplate(tagTemplate, sizeof(tagTemplate), _manager->getIdAndIncrement(), markType, env->_cycleState->_verboseContextID, totalTime, j9time_current_time_millis());551enterAtomicReportingBlock();552if (!totalTimeSuccess) {553writer->formatAndOutput(env, 0, "<warning details=\"clock error detected, following timing may be inaccurate\" />");554}555writer->formatAndOutput(env, 0, "<gc-op %s>", tagTemplate);556557writer->formatAndOutput(env, 1, "<trace-info objectcount=\"%zu\" scancount=\"%zu\" scanbytes=\"%zu\" />",558markStats->_objectsMarked, markStats->_objectsScanned, markStats->_bytesScanned);559560if (0 != markStats->_objectsCardClean) {561writer->formatAndOutput(env, 1, "<cardclean-info objects=\"%zu\" bytes=\"%zu\" />",562markStats->_objectsCardClean, markStats->_bytesCardClean);563}564565if (NULL != irrsStats) {566/* report only for PGC */567outputRememberedSetClearedInfo(env, irrsStats);568}569570outputUnfinalizedInfo(env, 1, markStats->_unfinalizedCandidates, markStats->_unfinalizedEnqueued);571outputOwnableSynchronizerInfo(env, 1, markStats->_ownableSynchronizerCandidates, markStats->_ownableSynchronizerCleared);572573outputReferenceInfo(env, 1, "soft", &markStats->_softReferenceStats, extensions->getDynamicMaxSoftReferenceAge(), extensions->getMaxSoftReferenceAge());574outputReferenceInfo(env, 1, "weak", &markStats->_weakReferenceStats, 0, 0);575outputReferenceInfo(env, 1, "phantom", &markStats->_phantomReferenceStats, 0, 0);576577outputStringConstantInfo(env, 1, markStats->_stringConstantsCandidates, markStats->_stringConstantsCleared);578outputMonitorReferenceInfo(env, 1, markStats->_monitorReferenceCandidates, markStats->_monitorReferenceCleared);579580switch (env->_cycleState->_reasonForMarkCompactPGC) {581case MM_CycleState::reason_not_exceptional:582/* nothing to report */583break;584case MM_CycleState::reason_JNI_critical_in_Eden:585writer->formatAndOutput(env, 1, "<warning details=\"Mark invoked due to active JNI critical regions\" />");586break;587case MM_CycleState::reason_calibration:588writer->formatAndOutput(env, 1, "<warning details=\"Mark for calibration purposes\" />");589break;590case MM_CycleState::reason_recent_abort:591writer->formatAndOutput(env, 1, "<warning details=\"Mark invoked due to recent Copy-Forward abort\" />");592break;593case MM_CycleState::reason_insufficient_free_space:594writer->formatAndOutput(env, 1, "<warning details=\"Mark invoked due to insufficient free space for Copy-Forward\" />");595break;596default:597writer->formatAndOutput(env, 1, "<warning details=\"Unknown reason for Mark-Compact collect: %zu\" />", (UDATA)env->_cycleState->_reasonForMarkCompactPGC);598break;599}600601if(workPacketStats->getSTWWorkStackOverflowOccured()) {602writer->formatAndOutput(env, 1, "<warning details=\"work packet overflow\" count=\"%zu\" packetcount=\"%zu\" />",603workPacketStats->getSTWWorkStackOverflowCount(), workPacketStats->getSTWWorkpacketCountAtOverflow());604}605606writer->formatAndOutput(env, 0, "</gc-op>");607writer->flush(env);608exitAtomicReportingBlock();609}610611void612MM_VerboseHandlerOutputVLHGC::handleReclaimSweepStart(J9HookInterface** hook, UDATA eventNum, void* eventData)613{614/* No implementation */615}616617void618MM_VerboseHandlerOutputVLHGC::handleReclaimSweepEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)619{620MM_ReclaimSweepEndEvent * event = (MM_ReclaimSweepEndEvent *)eventData;621MM_VerboseWriterChain* writer = _manager->getWriterChain();622MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);623MM_SweepVLHGCStats *sweepStats = (MM_SweepVLHGCStats *)event->sweepStats;624PORT_ACCESS_FROM_ENVIRONMENT(env);625U_64 totalTime = 0;626bool totalTimeSuccess = getTimeDeltaInMicroSeconds(&totalTime, sweepStats->_startTime, sweepStats->_endTime);627628char tagTemplate[200];629getTagTemplate(tagTemplate, sizeof(tagTemplate), _manager->getIdAndIncrement(), "sweep", env->_cycleState->_verboseContextID, totalTime, j9time_current_time_millis());630enterAtomicReportingBlock();631if (!totalTimeSuccess) {632writer->formatAndOutput(env, 0, "<warning details=\"clock error detected, following timing may be inaccurate\" />");633}634writer->formatAndOutput(env, 0, "<gc-op %s />", tagTemplate);635writer->flush(env);636exitAtomicReportingBlock();637}638639void640MM_VerboseHandlerOutputVLHGC::handleReclaimCompactStart(J9HookInterface** hook, UDATA eventNum, void* eventData)641{642/* No implementation */643}644645void646MM_VerboseHandlerOutputVLHGC::handleReclaimCompactEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)647{648MM_ReclaimCompactEndEvent * event = (MM_ReclaimCompactEndEvent *)eventData;649MM_VerboseWriterChain* writer = _manager->getWriterChain();650MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);651MM_CompactVLHGCStats *compactStats = (MM_CompactVLHGCStats *)event->compactStats;652MM_InterRegionRememberedSetStats *irrsStats = (MM_InterRegionRememberedSetStats *)event->irrsStats;653PORT_ACCESS_FROM_ENVIRONMENT(env);654U_64 totalTime = 0;655bool totalTimeSuccess = getTimeDeltaInMicroSeconds(&totalTime, compactStats->_startTime, compactStats->_endTime);656657char tagTemplate[200];658getTagTemplate(tagTemplate, sizeof(tagTemplate), _manager->getIdAndIncrement(), "compact", env->_cycleState->_verboseContextID, totalTime, j9time_current_time_millis());659enterAtomicReportingBlock();660if (!totalTimeSuccess) {661writer->formatAndOutput(env, 0, "<warning details=\"clock error detected, following timing may be inaccurate\" />");662}663writer->formatAndOutput(env, 0, "<gc-op %s>", tagTemplate);664writer->formatAndOutput(env, 1, "<compact-info movecount=\"%zu\" movebytes=\"%zu\" />", compactStats->_movedObjects, compactStats->_movedBytes);665666outputRememberedSetClearedInfo(env, irrsStats);667668writer->formatAndOutput(env, 0, "</gc-op>");669writer->flush(env);670exitAtomicReportingBlock();671}672673void674MM_VerboseHandlerOutputVLHGC::handleClassUnloadEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)675{676MM_ClassUnloadingEndEvent* event = (MM_ClassUnloadingEndEvent*)eventData;677MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment((OMR_VMThread *)event->currentThread->omrVMThread);678MM_VerboseManager* manager = getManager();679MM_VerboseWriterChain* writer = manager->getWriterChain();680MM_ClassUnloadStats *classUnloadStats = &static_cast<MM_CycleStateVLHGC*>(env->_cycleState)->_vlhgcIncrementStats._classUnloadStats;681PORT_ACCESS_FROM_ENVIRONMENT(env);682U_64 totalTime = 0;683bool totalTimeSuccess = getTimeDeltaInMicroSeconds(&totalTime, classUnloadStats->_startTime, classUnloadStats->_endTime);684685char tagTemplate[200];686getTagTemplate(tagTemplate, sizeof(tagTemplate), _manager->getIdAndIncrement(), "classunload", env->_cycleState->_verboseContextID, totalTime, j9time_current_time_millis());687enterAtomicReportingBlock();688if (!totalTimeSuccess) {689writer->formatAndOutput(env, 0, "<warning details=\"clock error detected, following timing may be inaccurate\" />");690}691writer->formatAndOutput(env, 0, "<gc-op %s>", tagTemplate);692693694UDATA classLoaderUnloadedCount = classUnloadStats->_classLoaderUnloadedCount;695UDATA classLoaderCandidates = classUnloadStats->_classLoaderCandidates;696UDATA classesUnloadedCount = classUnloadStats->_classesUnloadedCount;697UDATA anonymousClassesUnloadedCount = classUnloadStats->_anonymousClassesUnloadedCount;698699U_64 setupTime = 0;700bool partialTimeSuccess = getTimeDeltaInMicroSeconds(&setupTime, classUnloadStats->_startSetupTime, classUnloadStats->_endSetupTime);701U_64 scanTime = 0;702partialTimeSuccess = (partialTimeSuccess && getTimeDeltaInMicroSeconds(&scanTime, classUnloadStats->_startScanTime, classUnloadStats->_endScanTime));703U_64 postTime = 0;704partialTimeSuccess = (partialTimeSuccess && getTimeDeltaInMicroSeconds(&postTime, classUnloadStats->_startPostTime, classUnloadStats->_endPostTime));705/* !!!Note: classUnloadStats->_classUnloadMutexQuiesceTime is in us already, do not convert it again!!!*/706U_64 quiesceTime = classUnloadStats->_classUnloadMutexQuiesceTime;707708writer->formatAndOutput(709env, 1,710"<classunload-info classloadercandidates=\"%zu\" classloadersunloaded=\"%zu\" classesunloaded=\"%zu\" anonymousclassesunloaded=\"%zu\" quiescems=\"%llu.%03.3llu\" setupms=\"%llu.%03.3llu\" scanms=\"%llu.%03.3llu\" postms=\"%llu.%03.3llu\" />",711classLoaderCandidates, classLoaderUnloadedCount, classesUnloadedCount, anonymousClassesUnloadedCount,712quiesceTime / 1000, quiesceTime % 1000,713setupTime / 1000, setupTime % 1000,714scanTime / 1000, scanTime % 1000,715postTime / 1000, postTime % 1000);716717if (!partialTimeSuccess) {718writer->formatAndOutput(env, 1, "<warning details=\"clock error detected, previous timing may be inaccurate\" />");719}720721writer->formatAndOutput(env, 0, "</gc-op>");722writer->flush(env);723exitAtomicReportingBlock();724}725726const char *727MM_VerboseHandlerOutputVLHGC::getCycleType(UDATA type)728{729const char *cycleType = NULL;730731switch (type) {732case OMR_GC_CYCLE_TYPE_VLHGC_PARTIAL_GARBAGE_COLLECT:733cycleType = "partial gc";734break;735case OMR_GC_CYCLE_TYPE_VLHGC_GLOBAL_MARK_PHASE:736cycleType = "global mark phase";737break;738case OMR_GC_CYCLE_TYPE_VLHGC_GLOBAL_GARBAGE_COLLECT:739cycleType = "global garbage collect";740break;741default:742cycleType = "unknown";743break;744}745746return cycleType;747}748749const char *750MM_VerboseHandlerOutputVLHGC::getConcurrentTerminationReason(MM_ConcurrentPhaseStatsBase *stats)751{752const char *reasonForTermination = NULL;753UDATA bytesScanned = stats->_bytesScanned;754bool didComplete = bytesScanned >= stats->_scanTargetInBytes;755756if (stats->_terminationWasRequested) {757if (didComplete) {758reasonForTermination = "Work target met and termination requested";759} else {760reasonForTermination = "Termination requested";761}762} else {763if (didComplete) {764reasonForTermination = "Work target met";765} else {766reasonForTermination = "Completed all work in GC phase";767}768}769770return reasonForTermination;771}772773void774verboseHandlerTaxationEntryPoint(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)775{776((MM_VerboseHandlerOutputVLHGC *)userData)->handleTaxationEntryPoint(hook, eventNum, eventData);777}778779void780verboseHandlerGCStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)781{782((MM_VerboseHandlerOutput *)userData)->handleGCStart(hook, eventNum, eventData);783}784785void786verboseHandlerGCEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)787{788((MM_VerboseHandlerOutput *)userData)->handleGCEnd(hook, eventNum, eventData);789}790791void792verboseHandlerCycleStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)793{794((MM_VerboseHandlerOutput *)userData)->handleCycleStart(hook, eventNum, eventData);795}796797void798verboseHandlerCycleContinue(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)799{800((MM_VerboseHandlerOutput *)userData)->handleCycleContinue(hook, eventNum, eventData);801}802803void804verboseHandlerCycleEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)805{806((MM_VerboseHandlerOutput *)userData)->handleCycleEnd(hook, eventNum, eventData);807}808809void810verboseHandlerExclusiveStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)811{812((MM_VerboseHandlerOutput*)userData)->handleExclusiveStart(hook, eventNum, eventData);813}814815void816verboseHandlerExclusiveEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)817{818((MM_VerboseHandlerOutput*)userData)->handleExclusiveEnd(hook, eventNum, eventData);819}820821void822verboseHandlerSystemGCStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)823{824((MM_VerboseHandlerOutput *)userData)->handleSystemGCStart(hook, eventNum, eventData);825}826827void828verboseHandlerSystemGCEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)829{830((MM_VerboseHandlerOutput *)userData)->handleSystemGCEnd(hook, eventNum, eventData);831}832833void834verboseHandlerAllocationFailureStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)835{836((MM_VerboseHandlerOutput *)userData)->handleAllocationFailureStart(hook, eventNum, eventData);837}838839void840verboseHandlerFailedAllocationCompleted(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)841{842((MM_VerboseHandlerOutput *)userData)->handleFailedAllocationCompleted(hook, eventNum, eventData);843}844845void846verboseHandlerAllocationFailureEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)847{848((MM_VerboseHandlerOutput *)userData)->handleAllocationFailureEnd(hook, eventNum, eventData);849}850851void852verboseHandlerCopyForwardStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)853{854((MM_VerboseHandlerOutputVLHGC *)userData)->handleCopyForwardStart(hook, eventNum, eventData);855}856857void858verboseHandlerCopyForwardEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)859{860((MM_VerboseHandlerOutputVLHGC *)userData)->handleCopyForwardEnd(hook, eventNum, eventData);861}862863void864verboseHandlerConcurrentStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)865{866((MM_VerboseHandlerOutput *)userData)->handleConcurrentStart(hook, eventNum, eventData);867}868869void870verboseHandlerConcurrentEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)871{872((MM_VerboseHandlerOutput *)userData)->handleConcurrentEnd(hook, eventNum, eventData);873}874875void876verboseHandlerGMPMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)877{878((MM_VerboseHandlerOutputVLHGC *)userData)->handleGMPMarkStart(hook, eventNum, eventData);879}880881void882verboseHandlerGMPMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)883{884((MM_VerboseHandlerOutputVLHGC *)userData)->handleGMPMarkEnd(hook, eventNum, eventData);885}886887void888verboseHandlerGlobalGCMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)889{890((MM_VerboseHandlerOutputVLHGC *)userData)->handleGlobalGCMarkStart(hook, eventNum, eventData);891}892893void894verboseHandlerGlobalGCMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)895{896((MM_VerboseHandlerOutputVLHGC *)userData)->handleGlobalGCMarkEnd(hook, eventNum, eventData);897}898899void900verboseHandlerPGCMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)901{902((MM_VerboseHandlerOutputVLHGC *)userData)->handlePGCMarkStart(hook, eventNum, eventData);903}904905void906verboseHandlerPGCMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)907{908((MM_VerboseHandlerOutputVLHGC *)userData)->handlePGCMarkEnd(hook, eventNum, eventData);909}910911void912verboseHandlerReclaimSweepStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)913{914((MM_VerboseHandlerOutputVLHGC *)userData)->handleReclaimSweepStart(hook, eventNum, eventData);915}916917void918verboseHandlerReclaimSweepEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)919{920((MM_VerboseHandlerOutputVLHGC *)userData)->handleReclaimSweepEnd(hook, eventNum, eventData);921}922923void924verboseHandlerReclaimCompactStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)925{926((MM_VerboseHandlerOutputVLHGC *)userData)->handleReclaimCompactStart(hook, eventNum, eventData);927}928929void930verboseHandlerReclaimCompactEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)931{932((MM_VerboseHandlerOutputVLHGC *)userData)->handleReclaimCompactEnd(hook, eventNum, eventData);933}934935void936verboseHandlerExcessiveGCRaised(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)937{938((MM_VerboseHandlerOutputVLHGC *)userData)->handleExcessiveGCRaised(hook, eventNum, eventData);939}940941void verboseHandlerAcquiredExclusiveToSatisfyAllocation(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)942{943((MM_VerboseHandlerOutputVLHGC *)userData)->handleAcquiredExclusiveToSatisfyAllocation(hook, eventNum, eventData);944}945946#if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)947void verboseHandlerClassUnloadingEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)948{949((MM_VerboseHandlerOutputVLHGC *)userData)->handleClassUnloadEnd(hook, eventNum, eventData);950}951#endif /* defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING) */952953954955