Path: blob/master/runtime/gc_trace_vlhgc/TgcIntelligentCompact.cpp
5986 views
1/*******************************************************************************2* Copyright (c) 1991, 2018 IBM Corp. and others3*4* This program and the accompanying materials are made available under5* the terms of the Eclipse Public License 2.0 which accompanies this6* distribution and is available at https://www.eclipse.org/legal/epl-2.0/7* or the Apache License, Version 2.0 which accompanies this distribution and8* is available at https://www.apache.org/licenses/LICENSE-2.0.9*10* This Source Code may also be made available under the following11* Secondary Licenses when the conditions for such availability set12* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU13* General Public License, version 2 with the GNU Classpath14* Exception [1] and GNU General Public License, version 2 with the15* OpenJDK Assembly Exception [2].16*17* [1] https://www.gnu.org/software/classpath/license.html18* [2] http://openjdk.java.net/legal/assembly-exception.html19*20* 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-exception21*******************************************************************************/2223#include "j9.h"24#include "j9cfg.h"25#include "j9port.h"26#include "Tgc.hpp"27#include "mmhook.h"2829#include <math.h>3031#if defined(J9VM_GC_MODRON_COMPACTION)3233#include "GCExtensions.hpp"34#include "TgcExtensions.hpp"3536#include "HeapRegionIteratorVLHGC.hpp"37#include "HeapRegionDescriptorVLHGC.hpp"3839static void40processCompactDataForTGC(J9JavaVM *javaVM, MM_CompactStartEvent* event, bool forCompactRegionOnly)41{42MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(javaVM);43MM_TgcExtensions *tgcExtensions = MM_TgcExtensions::getExtensions(extensions);44/* Calculate the average scores for regions */45double totalRegionCount = 0;46#if 047double sumRegionAgeNormalized = 0;48double sumDarkMatterNormalized = 0;49double sumTotalFreeNormalized = 0;50double sumAverageFreeNormalized = 0;51double sumAbilityToSatisfyAllocateNormalized = 0;52#endif53double scoreBucket90_100 = 0;54double scoreBucket80_90 = 0;55double scoreBucket70_80 = 0;56double scoreBucket60_70 = 0;57double scoreBucket50_60 = 0;58double scoreBucket40_50 = 0;59double scoreBucket20_40 = 0;60double scoreBucket0_20 = 0;61MM_HeapRegionDescriptorVLHGC *region = NULL;62/* Calculate average and std deviation for individual compact scores */63GC_HeapRegionIteratorVLHGC regionIterator1(extensions->heap->getHeapRegionManager(), MM_HeapRegionDescriptor::MANAGED);64while(NULL != (region = regionIterator1.nextRegion())) {65if (region->containsObjects() && (!forCompactRegionOnly || region->_compactData._shouldCompact)) {66totalRegionCount+=1;67#if 068sumRegionAgeNormalized += region->_compactData._regionAgeNormalized;69sumDarkMatterNormalized += region->_compactData._darkMatterNormalized;70sumTotalFreeNormalized += region->_compactData._totalFreeNormalized;71sumAverageFreeNormalized += region->_compactData._averageFreeNormalized;72sumAbilityToSatisfyAllocateNormalized += region->_compactData._abilityToSatisfyAllocateNormalized;73#endif74double currentScore = region->_compactData._compactScore;75if (currentScore > 90.0) {76scoreBucket90_100+=1;77} else if (currentScore > 80.0) {78scoreBucket80_90+=1;79} else if (currentScore > 70.0) {80scoreBucket70_80+=1;81} else if (currentScore > 60.0) {82scoreBucket60_70+=1;83} else if (currentScore > 50.0) {84scoreBucket50_60+=1;85} else if (currentScore > 40.0) {86scoreBucket40_50+=1;87} else if (currentScore > 20.0) {88scoreBucket20_40+=1;89} else {90scoreBucket0_20+=1;91}92}93}94#if 095double avgRegionAgeNormalized = sumRegionAgeNormalized / totalRegionCount;96double avgDarkMatterNormalized = sumDarkMatterNormalized / totalRegionCount;97double avgTotalFreeNormalized = sumTotalFreeNormalized / totalRegionCount;98double avgAverageFreeNormalized = sumAverageFreeNormalized / totalRegionCount;99double avgAbilityToSatisfyAllocateNormalized = sumAbilityToSatisfyAllocateNormalized / totalRegionCount;100101/* Use the averages from previous operation to calculate the standard deviation */102double std_deviation_sqr_avgRegionAgeNormalized = 0;103double std_deviation_sqr_avgDarkMatterNormalized = 0;104double std_deviation_sqr_avgTotalFreeNormalized = 0;105double std_deviation_sqr_avgAverageFreeNormalized = 0;106double std_deviation_sqr_avgAbilityToSatisfyAllocateNormalized = 0;107GC_HeapRegionIteratorVLHGC regionIterator2(extensions->heap->getHeapRegionManager(), MM_HeapRegionDescriptor::MANAGED);108region = NULL;109while (NULL != (region = regionIterator2.nextRegion())) {110if (!forCompactRegionOnly || region->_compactData._shouldCompact) {111double diff_avgRegionAgeNormalized = avgRegionAgeNormalized - region->_compactData._regionAgeNormalized;112std_deviation_sqr_avgRegionAgeNormalized += (diff_avgRegionAgeNormalized * diff_avgRegionAgeNormalized);113114double diff_avgDarkMatterNormalized = (avgDarkMatterNormalized - region->_compactData._darkMatterNormalized);115std_deviation_sqr_avgDarkMatterNormalized += (diff_avgDarkMatterNormalized * diff_avgDarkMatterNormalized);116117double diff_avgTotalFreeNormalized = (avgTotalFreeNormalized - region->_compactData._totalFreeNormalized);118std_deviation_sqr_avgTotalFreeNormalized += (diff_avgTotalFreeNormalized * diff_avgTotalFreeNormalized);119120double diff_avgAverageFreeNormalized = (avgAverageFreeNormalized - region->_compactData._averageFreeNormalized);121std_deviation_sqr_avgAverageFreeNormalized += (diff_avgAverageFreeNormalized * diff_avgAverageFreeNormalized);122123double diff_avgAbilityToSatisfyAllocateNormalized = (avgAbilityToSatisfyAllocateNormalized - region->_compactData._abilityToSatisfyAllocateNormalized);124std_deviation_sqr_avgAbilityToSatisfyAllocateNormalized += (diff_avgAbilityToSatisfyAllocateNormalized * diff_avgAbilityToSatisfyAllocateNormalized);125}126}127double std_dev_avgRegionAgeNormalized = sqrt(std_deviation_sqr_avgRegionAgeNormalized / totalRegionCount);128double std_dev_avgDarkMatterNormalized = sqrt(std_deviation_sqr_avgDarkMatterNormalized / totalRegionCount);129double std_dev_avgTotalFreeNormalized = sqrt(std_deviation_sqr_avgTotalFreeNormalized / totalRegionCount);130double std_dev_avgAverageFreeNormalized = sqrt(std_deviation_sqr_avgAverageFreeNormalized / totalRegionCount);131double std_dev_avgAbilityToSatisfyAllocateNormalized = sqrt(std_deviation_sqr_avgAbilityToSatisfyAllocateNormalized / totalRegionCount);132#endif133134UDATA gcCount = event->gcCount;135tgcExtensions->printf("Compact(%zu): region count: %.0f\n", gcCount, totalRegionCount);136#if 0137tgcExtensions->printf("Compact(%zu): %10s %10s %10s %12s %25s\n", gcCount, "RegionAge", "DarkMatter", "TotalFree", "AverageFree", "AbilityToSatisfyAllocate");138tgcExtensions->printf("Compact(%zu): avg %10.0f %10.0f %10.0f %12.0f %25.0f\n",139gcCount, avgRegionAgeNormalized, avgDarkMatterNormalized, avgTotalFreeNormalized, avgAverageFreeNormalized, avgAbilityToSatisfyAllocateNormalized);140tgcExtensions->printf("Compact(%zu): std deviation %10.0f %10.0f %10.0f %12.0f %25.0f\n",141gcCount,142std_dev_avgRegionAgeNormalized,143std_dev_avgDarkMatterNormalized,144std_dev_avgTotalFreeNormalized,145std_dev_avgAverageFreeNormalized,146std_dev_avgAbilityToSatisfyAllocateNormalized);147#endif148149tgcExtensions->printf("Compact(%zu): Score distribution:\n", gcCount);150tgcExtensions->printf("Compact(%zu): Range: %6s %6s %6s %6s %6s %6s %6s %6s\n",151gcCount, "<= 20", "<= 40", "<= 50", "<= 60", "<= 70", "<= 80", "<= 90", "<= 100");152tgcExtensions->printf("Compact(%zu): Region Count:%6.0f %6.0f %6.0f %6.0f %6.0f %6.0f %6.0f %6.0f\n",153gcCount,154scoreBucket0_20,155scoreBucket20_40,156scoreBucket40_50,157scoreBucket50_60,158scoreBucket60_70,159scoreBucket70_80,160scoreBucket80_90,161scoreBucket90_100);162}163164/**165* Report NUMA statistics prior to a collection166*/167static void168tgcHookReportIntelligentCompactStatistics(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)169{170MM_CompactStartEvent* event = (MM_CompactStartEvent*)eventData;171UDATA gcCount = event->gcCount;172J9JavaVM *javaVM = static_cast<J9VMThread*>(event->currentThread->_language_vmthread)->javaVM;173MM_TgcExtensions *tgcExtensions = MM_TgcExtensions::getExtensions(javaVM);174175/* report TGC stats for all regoins */176tgcExtensions->printf("Compact(%zu): For All Regions:\n", gcCount);177processCompactDataForTGC(javaVM, event, false);178179/* report TGC stats for compact regoins */180tgcExtensions->printf("Compact(%zu): For Compact Regions:\n", gcCount);181processCompactDataForTGC(javaVM, event, true);182}183184185/**186* Initialize NUMA tgc tracing.187* Attaches hooks to the appropriate functions handling events used by NUMA tgc tracing.188*/189bool190tgcIntelligentCompactInitialize(J9JavaVM *javaVM)191{192MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(javaVM);193bool result = true;194195J9HookInterface** privateHooks = J9_HOOK_INTERFACE(extensions->privateHookInterface);196(*privateHooks)->J9HookRegisterWithCallSite(privateHooks, J9HOOK_MM_PRIVATE_COMPACT_START, tgcHookReportIntelligentCompactStatistics, OMR_GET_CALLSITE(), NULL);197198return result;199}200201#endif /* J9VM_GC_MODRON_COMPACTION */202203204