Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/gc_trace_vlhgc/TgcIntelligentCompact.cpp
5986 views
1
2
/*******************************************************************************
3
* Copyright (c) 1991, 2018 IBM Corp. and others
4
*
5
* This program and the accompanying materials are made available under
6
* the terms of the Eclipse Public License 2.0 which accompanies this
7
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
8
* or the Apache License, Version 2.0 which accompanies this distribution and
9
* is available at https://www.apache.org/licenses/LICENSE-2.0.
10
*
11
* This Source Code may also be made available under the following
12
* Secondary Licenses when the conditions for such availability set
13
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
14
* General Public License, version 2 with the GNU Classpath
15
* Exception [1] and GNU General Public License, version 2 with the
16
* OpenJDK Assembly Exception [2].
17
*
18
* [1] https://www.gnu.org/software/classpath/license.html
19
* [2] http://openjdk.java.net/legal/assembly-exception.html
20
*
21
* 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-exception
22
*******************************************************************************/
23
24
#include "j9.h"
25
#include "j9cfg.h"
26
#include "j9port.h"
27
#include "Tgc.hpp"
28
#include "mmhook.h"
29
30
#include <math.h>
31
32
#if defined(J9VM_GC_MODRON_COMPACTION)
33
34
#include "GCExtensions.hpp"
35
#include "TgcExtensions.hpp"
36
37
#include "HeapRegionIteratorVLHGC.hpp"
38
#include "HeapRegionDescriptorVLHGC.hpp"
39
40
static void
41
processCompactDataForTGC(J9JavaVM *javaVM, MM_CompactStartEvent* event, bool forCompactRegionOnly)
42
{
43
MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(javaVM);
44
MM_TgcExtensions *tgcExtensions = MM_TgcExtensions::getExtensions(extensions);
45
/* Calculate the average scores for regions */
46
double totalRegionCount = 0;
47
#if 0
48
double sumRegionAgeNormalized = 0;
49
double sumDarkMatterNormalized = 0;
50
double sumTotalFreeNormalized = 0;
51
double sumAverageFreeNormalized = 0;
52
double sumAbilityToSatisfyAllocateNormalized = 0;
53
#endif
54
double scoreBucket90_100 = 0;
55
double scoreBucket80_90 = 0;
56
double scoreBucket70_80 = 0;
57
double scoreBucket60_70 = 0;
58
double scoreBucket50_60 = 0;
59
double scoreBucket40_50 = 0;
60
double scoreBucket20_40 = 0;
61
double scoreBucket0_20 = 0;
62
MM_HeapRegionDescriptorVLHGC *region = NULL;
63
/* Calculate average and std deviation for individual compact scores */
64
GC_HeapRegionIteratorVLHGC regionIterator1(extensions->heap->getHeapRegionManager(), MM_HeapRegionDescriptor::MANAGED);
65
while(NULL != (region = regionIterator1.nextRegion())) {
66
if (region->containsObjects() && (!forCompactRegionOnly || region->_compactData._shouldCompact)) {
67
totalRegionCount+=1;
68
#if 0
69
sumRegionAgeNormalized += region->_compactData._regionAgeNormalized;
70
sumDarkMatterNormalized += region->_compactData._darkMatterNormalized;
71
sumTotalFreeNormalized += region->_compactData._totalFreeNormalized;
72
sumAverageFreeNormalized += region->_compactData._averageFreeNormalized;
73
sumAbilityToSatisfyAllocateNormalized += region->_compactData._abilityToSatisfyAllocateNormalized;
74
#endif
75
double currentScore = region->_compactData._compactScore;
76
if (currentScore > 90.0) {
77
scoreBucket90_100+=1;
78
} else if (currentScore > 80.0) {
79
scoreBucket80_90+=1;
80
} else if (currentScore > 70.0) {
81
scoreBucket70_80+=1;
82
} else if (currentScore > 60.0) {
83
scoreBucket60_70+=1;
84
} else if (currentScore > 50.0) {
85
scoreBucket50_60+=1;
86
} else if (currentScore > 40.0) {
87
scoreBucket40_50+=1;
88
} else if (currentScore > 20.0) {
89
scoreBucket20_40+=1;
90
} else {
91
scoreBucket0_20+=1;
92
}
93
}
94
}
95
#if 0
96
double avgRegionAgeNormalized = sumRegionAgeNormalized / totalRegionCount;
97
double avgDarkMatterNormalized = sumDarkMatterNormalized / totalRegionCount;
98
double avgTotalFreeNormalized = sumTotalFreeNormalized / totalRegionCount;
99
double avgAverageFreeNormalized = sumAverageFreeNormalized / totalRegionCount;
100
double avgAbilityToSatisfyAllocateNormalized = sumAbilityToSatisfyAllocateNormalized / totalRegionCount;
101
102
/* Use the averages from previous operation to calculate the standard deviation */
103
double std_deviation_sqr_avgRegionAgeNormalized = 0;
104
double std_deviation_sqr_avgDarkMatterNormalized = 0;
105
double std_deviation_sqr_avgTotalFreeNormalized = 0;
106
double std_deviation_sqr_avgAverageFreeNormalized = 0;
107
double std_deviation_sqr_avgAbilityToSatisfyAllocateNormalized = 0;
108
GC_HeapRegionIteratorVLHGC regionIterator2(extensions->heap->getHeapRegionManager(), MM_HeapRegionDescriptor::MANAGED);
109
region = NULL;
110
while (NULL != (region = regionIterator2.nextRegion())) {
111
if (!forCompactRegionOnly || region->_compactData._shouldCompact) {
112
double diff_avgRegionAgeNormalized = avgRegionAgeNormalized - region->_compactData._regionAgeNormalized;
113
std_deviation_sqr_avgRegionAgeNormalized += (diff_avgRegionAgeNormalized * diff_avgRegionAgeNormalized);
114
115
double diff_avgDarkMatterNormalized = (avgDarkMatterNormalized - region->_compactData._darkMatterNormalized);
116
std_deviation_sqr_avgDarkMatterNormalized += (diff_avgDarkMatterNormalized * diff_avgDarkMatterNormalized);
117
118
double diff_avgTotalFreeNormalized = (avgTotalFreeNormalized - region->_compactData._totalFreeNormalized);
119
std_deviation_sqr_avgTotalFreeNormalized += (diff_avgTotalFreeNormalized * diff_avgTotalFreeNormalized);
120
121
double diff_avgAverageFreeNormalized = (avgAverageFreeNormalized - region->_compactData._averageFreeNormalized);
122
std_deviation_sqr_avgAverageFreeNormalized += (diff_avgAverageFreeNormalized * diff_avgAverageFreeNormalized);
123
124
double diff_avgAbilityToSatisfyAllocateNormalized = (avgAbilityToSatisfyAllocateNormalized - region->_compactData._abilityToSatisfyAllocateNormalized);
125
std_deviation_sqr_avgAbilityToSatisfyAllocateNormalized += (diff_avgAbilityToSatisfyAllocateNormalized * diff_avgAbilityToSatisfyAllocateNormalized);
126
}
127
}
128
double std_dev_avgRegionAgeNormalized = sqrt(std_deviation_sqr_avgRegionAgeNormalized / totalRegionCount);
129
double std_dev_avgDarkMatterNormalized = sqrt(std_deviation_sqr_avgDarkMatterNormalized / totalRegionCount);
130
double std_dev_avgTotalFreeNormalized = sqrt(std_deviation_sqr_avgTotalFreeNormalized / totalRegionCount);
131
double std_dev_avgAverageFreeNormalized = sqrt(std_deviation_sqr_avgAverageFreeNormalized / totalRegionCount);
132
double std_dev_avgAbilityToSatisfyAllocateNormalized = sqrt(std_deviation_sqr_avgAbilityToSatisfyAllocateNormalized / totalRegionCount);
133
#endif
134
135
UDATA gcCount = event->gcCount;
136
tgcExtensions->printf("Compact(%zu): region count: %.0f\n", gcCount, totalRegionCount);
137
#if 0
138
tgcExtensions->printf("Compact(%zu): %10s %10s %10s %12s %25s\n", gcCount, "RegionAge", "DarkMatter", "TotalFree", "AverageFree", "AbilityToSatisfyAllocate");
139
tgcExtensions->printf("Compact(%zu): avg %10.0f %10.0f %10.0f %12.0f %25.0f\n",
140
gcCount, avgRegionAgeNormalized, avgDarkMatterNormalized, avgTotalFreeNormalized, avgAverageFreeNormalized, avgAbilityToSatisfyAllocateNormalized);
141
tgcExtensions->printf("Compact(%zu): std deviation %10.0f %10.0f %10.0f %12.0f %25.0f\n",
142
gcCount,
143
std_dev_avgRegionAgeNormalized,
144
std_dev_avgDarkMatterNormalized,
145
std_dev_avgTotalFreeNormalized,
146
std_dev_avgAverageFreeNormalized,
147
std_dev_avgAbilityToSatisfyAllocateNormalized);
148
#endif
149
150
tgcExtensions->printf("Compact(%zu): Score distribution:\n", gcCount);
151
tgcExtensions->printf("Compact(%zu): Range: %6s %6s %6s %6s %6s %6s %6s %6s\n",
152
gcCount, "<= 20", "<= 40", "<= 50", "<= 60", "<= 70", "<= 80", "<= 90", "<= 100");
153
tgcExtensions->printf("Compact(%zu): Region Count:%6.0f %6.0f %6.0f %6.0f %6.0f %6.0f %6.0f %6.0f\n",
154
gcCount,
155
scoreBucket0_20,
156
scoreBucket20_40,
157
scoreBucket40_50,
158
scoreBucket50_60,
159
scoreBucket60_70,
160
scoreBucket70_80,
161
scoreBucket80_90,
162
scoreBucket90_100);
163
}
164
165
/**
166
* Report NUMA statistics prior to a collection
167
*/
168
static void
169
tgcHookReportIntelligentCompactStatistics(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
170
{
171
MM_CompactStartEvent* event = (MM_CompactStartEvent*)eventData;
172
UDATA gcCount = event->gcCount;
173
J9JavaVM *javaVM = static_cast<J9VMThread*>(event->currentThread->_language_vmthread)->javaVM;
174
MM_TgcExtensions *tgcExtensions = MM_TgcExtensions::getExtensions(javaVM);
175
176
/* report TGC stats for all regoins */
177
tgcExtensions->printf("Compact(%zu): For All Regions:\n", gcCount);
178
processCompactDataForTGC(javaVM, event, false);
179
180
/* report TGC stats for compact regoins */
181
tgcExtensions->printf("Compact(%zu): For Compact Regions:\n", gcCount);
182
processCompactDataForTGC(javaVM, event, true);
183
}
184
185
186
/**
187
* Initialize NUMA tgc tracing.
188
* Attaches hooks to the appropriate functions handling events used by NUMA tgc tracing.
189
*/
190
bool
191
tgcIntelligentCompactInitialize(J9JavaVM *javaVM)
192
{
193
MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(javaVM);
194
bool result = true;
195
196
J9HookInterface** privateHooks = J9_HOOK_INTERFACE(extensions->privateHookInterface);
197
(*privateHooks)->J9HookRegisterWithCallSite(privateHooks, J9HOOK_MM_PRIVATE_COMPACT_START, tgcHookReportIntelligentCompactStatistics, OMR_GET_CALLSITE(), NULL);
198
199
return result;
200
}
201
202
#endif /* J9VM_GC_MODRON_COMPACTION */
203
204