Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/gc_trace_vlhgc/TgcProjectedStats.cpp
5986 views
1
2
/*******************************************************************************
3
* Copyright (c) 1991, 2017 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 <string.h>
31
32
#include "Base.hpp"
33
#include "CollectionSetDelegate.hpp"
34
#include "CompactGroupManager.hpp"
35
#include "CompactGroupPersistentStats.hpp"
36
#include "EnvironmentVLHGC.hpp"
37
#include "GCExtensions.hpp"
38
#include "TgcExtensions.hpp"
39
#include "HeapRegionIteratorVLHGC.hpp"
40
#include "HeapRegionDescriptorVLHGC.hpp"
41
#include "HeapRegionManager.hpp"
42
43
static void reportCompactGroupStats(MM_EnvironmentVLHGC *env);
44
static void decayPrintValue(MM_EnvironmentVLHGC *env, UDATA value);
45
static void printPercentage(MM_EnvironmentVLHGC *env, double value);
46
static void reportAverageAbsoluteDeviationForCompactGroups(MM_EnvironmentVLHGC *env);
47
48
static void
49
decayPrintValue(MM_EnvironmentVLHGC *env, UDATA value)
50
{
51
MM_TgcExtensions *tgcExtensions = MM_TgcExtensions::getExtensions(MM_GCExtensions::getExtensions(env));
52
53
char unitTable[] = { 'b', 'k', 'm', 'g', 't', 'p', 'e' };
54
char *units = &(unitTable[0]);
55
UDATA result = value;
56
UDATA remainder = 0;
57
58
while(result >= 1024) {
59
remainder = result % 1024;
60
result /= 1024;
61
units += 1;
62
}
63
64
if(result >= 100) {
65
tgcExtensions->printf("%4zu%c", result, *units);
66
} else if (result >= 10) {
67
UDATA decimal = (remainder * 10) / 1024;
68
tgcExtensions->printf("%2zu.%1.1zu%c", result, decimal, *units);
69
} else {
70
if(0 == result) {
71
tgcExtensions->printf(" 0");
72
} else {
73
UDATA decimal = (remainder * 100) / 1024;
74
tgcExtensions->printf("%1zu.%2.2zu%c", result, decimal, *units);
75
}
76
}
77
}
78
79
static void
80
printPercentage(MM_EnvironmentVLHGC *env, double value)
81
{
82
MM_TgcExtensions *tgcExtensions = MM_TgcExtensions::getExtensions(MM_GCExtensions::getExtensions(env));
83
84
tgcExtensions->printf("%4zu%%", (UDATA)(100.0 * value));
85
}
86
87
/**
88
* Report dynamic collection set statistics for PGC.
89
*/
90
static void
91
tgcHookReportProjectedStatsStatistics(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
92
{
93
MM_VlhgcGarbageCollectCompletedEvent* event = (MM_VlhgcGarbageCollectCompletedEvent*)eventData;
94
MM_EnvironmentVLHGC *env = MM_EnvironmentVLHGC::getEnvironment(event->currentThread);
95
MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(env);
96
MM_CompactGroupPersistentStats *persistentStats = extensions->compactGroupPersistentStats;
97
98
MM_CompactGroupPersistentStats::deriveProjectedLiveBytesStats(env, persistentStats);
99
100
reportCompactGroupStats(env);
101
reportAverageAbsoluteDeviationForCompactGroups(env);
102
}
103
104
/* Calculate the absolute deviation of the regions in every compact group */
105
static void
106
reportAverageAbsoluteDeviationForCompactGroups(MM_EnvironmentVLHGC *env)
107
{
108
MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(env);
109
MM_TgcExtensions *tgcExtensions = MM_TgcExtensions::getExtensions(extensions);
110
MM_HeapRegionManager *heapRegionManager = extensions->getHeap()->getHeapRegionManager();
111
MM_CompactGroupPersistentStats *persistentStats = extensions->compactGroupPersistentStats;
112
UDATA regionSize = heapRegionManager->getRegionSize();
113
UDATA compactGroupCount = MM_CompactGroupManager::getCompactGroupMaxCount(env);
114
UDATA totalAbsoluteDeviation = 0;
115
UDATA totalRegionCount = 0;
116
117
tgcExtensions->printf("\nCmpt Grp ");
118
for(UDATA tableIndex = 0; tableIndex <= extensions->tarokRegionMaxAge; tableIndex++) {
119
tgcExtensions->printf(" %5zu", tableIndex);
120
}
121
122
tgcExtensions->printf(" all");
123
124
tgcExtensions->printf("\n ");
125
for(UDATA tableIndex = 0; tableIndex <= extensions->tarokRegionMaxAge; tableIndex++) {
126
tgcExtensions->printf("------");
127
}
128
129
130
131
for(UDATA compactGroupIndex = 0; compactGroupIndex < compactGroupCount; compactGroupIndex++) {
132
if (MM_CompactGroupManager::getRegionAgeFromGroup(env, compactGroupIndex) == 0) {
133
tgcExtensions->printf("\nAvAbDv ");
134
UDATA allocationContextNumber = MM_CompactGroupManager::getAllocationContextNumberFromGroup(env, compactGroupIndex);
135
if (0 == allocationContextNumber) {
136
tgcExtensions->printf(" ");
137
} else {
138
tgcExtensions->printf("AC%2zu", allocationContextNumber);
139
}
140
}
141
142
UDATA liveBytesAbsoluteDeviation = persistentStats[compactGroupIndex]._liveBytesAbsoluteDeviation;
143
UDATA regionCount = persistentStats[compactGroupIndex]._regionCount;
144
145
if (0 != regionCount) {
146
double averageAbsoluteDeviation = (double)liveBytesAbsoluteDeviation / (double)regionCount;
147
double averageAbsoluteDeviationInRegionSize = averageAbsoluteDeviation / regionSize;
148
149
totalAbsoluteDeviation += liveBytesAbsoluteDeviation;
150
totalRegionCount += regionCount;
151
152
tgcExtensions->printf(" %.3f", averageAbsoluteDeviationInRegionSize);
153
} else {
154
tgcExtensions->printf(" NoRgn");
155
}
156
}
157
158
if (0 != totalRegionCount) {
159
double totalAverageAbsoluteDeviation = (double)totalAbsoluteDeviation / (double)totalRegionCount;
160
double totalAverageAbsoluteDeviationInRegionSize = totalAverageAbsoluteDeviation / (double)regionSize;
161
tgcExtensions->printf(" %.3f", totalAverageAbsoluteDeviationInRegionSize);
162
} else {
163
tgcExtensions->printf(" NoRgn");
164
}
165
166
tgcExtensions->printf("\n");
167
/* TODO: show distribution of regions vs their deviations */
168
}
169
170
171
static void
172
reportCompactGroupStats(MM_EnvironmentVLHGC *env)
173
{
174
MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(env);
175
MM_TgcExtensions *tgcExtensions = MM_TgcExtensions::getExtensions(extensions);
176
MM_CompactGroupPersistentStats *persistentStats = extensions->compactGroupPersistentStats;
177
UDATA compactGroupCount = MM_CompactGroupManager::getCompactGroupMaxCount(env);
178
179
/*
180
* Dump statistics to the TTY.
181
*/
182
tgcExtensions->printf("\n ");
183
for(UDATA tableIndex = 0; tableIndex <= extensions->tarokRegionMaxAge; tableIndex++) {
184
tgcExtensions->printf(" %5zu", tableIndex);
185
}
186
187
tgcExtensions->printf("\n ");
188
for(UDATA tableIndex = 0; tableIndex <= extensions->tarokRegionMaxAge; tableIndex++) {
189
tgcExtensions->printf("------");
190
}
191
192
for(UDATA compactGroupIndex = 0; compactGroupIndex < compactGroupCount; compactGroupIndex++) {
193
if (MM_CompactGroupManager::getRegionAgeFromGroup(env, compactGroupIndex) == 0) {
194
tgcExtensions->printf("\nPrLvB ");
195
UDATA allocationContextNumber = MM_CompactGroupManager::getAllocationContextNumberFromGroup(env, compactGroupIndex);
196
if (0 == allocationContextNumber) {
197
tgcExtensions->printf(" ");
198
} else {
199
tgcExtensions->printf("AC%2zu", allocationContextNumber);
200
}
201
202
}
203
tgcExtensions->printf(" ");
204
decayPrintValue(env, persistentStats[compactGroupIndex]._projectedLiveBytes);
205
}
206
for(UDATA compactGroupIndex = 0; compactGroupIndex < compactGroupCount; compactGroupIndex++) {
207
if (MM_CompactGroupManager::getRegionAgeFromGroup(env, compactGroupIndex) == 0) {
208
tgcExtensions->printf("\nPrISR ");
209
UDATA allocationContextNumber = MM_CompactGroupManager::getAllocationContextNumberFromGroup(env, compactGroupIndex);
210
if (0 == allocationContextNumber) {
211
tgcExtensions->printf(" ");
212
} else {
213
tgcExtensions->printf("AC%2zu", allocationContextNumber);
214
}
215
}
216
tgcExtensions->printf(" ");
217
printPercentage(env, persistentStats[compactGroupIndex]._projectedInstantaneousSurvivalRate);
218
}
219
220
tgcExtensions->printf("\n");
221
222
}
223
224
/**
225
* Initialize dynamic collection set tgc tracing.
226
* Attaches hooks to the appropriate functions handling events used by dynamic collection set tgc tracing.
227
*/
228
bool
229
tgcProjectedStatsInitialize(J9JavaVM *javaVM)
230
{
231
bool result = true;
232
MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(javaVM);
233
234
J9HookInterface** privateHooks = J9_HOOK_INTERFACE(extensions->privateHookInterface);
235
if (0 != (*privateHooks)->J9HookRegisterWithCallSite(privateHooks, J9HOOK_MM_PRIVATE_VLHGC_GARBAGE_COLLECT_COMPLETED, tgcHookReportProjectedStatsStatistics, OMR_GET_CALLSITE(), NULL)) {
236
result = false;
237
}
238
239
return result;
240
}
241
242
243
244