Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/gc_verbose_handler_vlhgc/VerboseHandlerOutputVLHGC.cpp
5986 views
1
/*******************************************************************************
2
* Copyright (c) 1991, 2021 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* 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 and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
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-exception
21
*******************************************************************************/
22
23
#include "VerboseHandlerOutputVLHGC.hpp"
24
25
#include "CollectionStatisticsVLHGC.hpp"
26
#include "ConcurrentPhaseStatsBase.hpp"
27
#include "CopyForwardStats.hpp"
28
#include "CycleStateVLHGC.hpp"
29
#include "EnvironmentBase.hpp"
30
#include "GCExtensions.hpp"
31
#include "MarkVLHGCStats.hpp"
32
#include "ReferenceStats.hpp"
33
#include "VerboseManager.hpp"
34
#include "VerboseWriterChain.hpp"
35
#include "VerboseHandlerJava.hpp"
36
37
#include "mmhook.h"
38
39
static void verboseHandlerGCStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
40
static void verboseHandlerGCEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
41
static void verboseHandlerTaxationEntryPoint(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
42
static void verboseHandlerCycleStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
43
static void verboseHandlerCycleContinue(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
44
static void verboseHandlerCycleEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
45
static void verboseHandlerExclusiveStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
46
static void verboseHandlerExclusiveEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
47
static void verboseHandlerSystemGCStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
48
static void verboseHandlerSystemGCEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
49
static void verboseHandlerAllocationFailureStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
50
static void verboseHandlerFailedAllocationCompleted(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
51
static void verboseHandlerAllocationFailureEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
52
static void verboseHandlerCopyForwardStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
53
static void verboseHandlerCopyForwardEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
54
static void verboseHandlerConcurrentStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
55
static void verboseHandlerConcurrentEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
56
static void verboseHandlerGMPMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
57
static void verboseHandlerGMPMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
58
static void verboseHandlerGlobalGCMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
59
static void verboseHandlerGlobalGCMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
60
static void verboseHandlerPGCMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
61
static void verboseHandlerPGCMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
62
static void verboseHandlerReclaimSweepStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
63
static void verboseHandlerReclaimSweepEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
64
static void verboseHandlerReclaimCompactStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
65
static void verboseHandlerReclaimCompactEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
66
static void verboseHandlerExcessiveGCRaised(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
67
static void verboseHandlerAcquiredExclusiveToSatisfyAllocation(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
68
static void verboseHandlerClassUnloadingEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
69
70
MM_VerboseHandlerOutput *
71
MM_VerboseHandlerOutputVLHGC::newInstance(MM_EnvironmentBase *env, MM_VerboseManager *manager)
72
{
73
MM_GCExtensions* extensions = MM_GCExtensions::getExtensions(env->getOmrVM());
74
75
MM_VerboseHandlerOutputVLHGC *verboseHandlerOutput = (MM_VerboseHandlerOutputVLHGC *)extensions->getForge()->allocate(sizeof(MM_VerboseHandlerOutputVLHGC), MM_AllocationCategory::FIXED, J9_GET_CALLSITE());
76
if (NULL != verboseHandlerOutput) {
77
new(verboseHandlerOutput) MM_VerboseHandlerOutputVLHGC(extensions);
78
if(!verboseHandlerOutput->initialize(env, manager)) {
79
verboseHandlerOutput->kill(env);
80
verboseHandlerOutput = NULL;
81
}
82
}
83
return verboseHandlerOutput;
84
}
85
86
bool
87
MM_VerboseHandlerOutputVLHGC::initialize(MM_EnvironmentBase *env, MM_VerboseManager *manager)
88
{
89
bool initSuccess = MM_VerboseHandlerOutput::initialize(env, manager);
90
91
_mmHooks = J9_HOOK_INTERFACE(MM_GCExtensions::getExtensions(_extensions)->hookInterface);
92
93
return initSuccess;
94
}
95
96
void
97
MM_VerboseHandlerOutputVLHGC::tearDown(MM_EnvironmentBase *env)
98
{
99
MM_VerboseHandlerOutput::tearDown(env);
100
}
101
102
void
103
MM_VerboseHandlerOutputVLHGC::enableVerbose()
104
{
105
MM_VerboseHandlerOutput::enableVerbose();
106
107
/* GCLaunch */
108
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SYSTEM_GC_START, verboseHandlerSystemGCStart, OMR_GET_CALLSITE(), (void *)this);
109
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SYSTEM_GC_END, verboseHandlerSystemGCEnd, OMR_GET_CALLSITE(), (void *)this);
110
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ALLOCATION_FAILURE_START, verboseHandlerAllocationFailureStart, OMR_GET_CALLSITE(), (void *)this);
111
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_FAILED_ALLOCATION_COMPLETED, verboseHandlerFailedAllocationCompleted, OMR_GET_CALLSITE(), (void *)this);
112
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ALLOCATION_FAILURE_END, verboseHandlerAllocationFailureEnd, OMR_GET_CALLSITE(), (void *)this);
113
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_TAROK_INCREMENT_START, verboseHandlerTaxationEntryPoint, OMR_GET_CALLSITE(), (void *)this);
114
115
/* Exclusive */
116
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_EXCLUSIVE_ACCESS_ACQUIRE, verboseHandlerExclusiveStart, OMR_GET_CALLSITE(), (void *)this);
117
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_EXCLUSIVE_ACCESS_RELEASE, verboseHandlerExclusiveEnd, OMR_GET_CALLSITE(), (void *)this);
118
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ACQUIRED_EXCLUSIVE_TO_SATISFY_ALLOCATION, verboseHandlerAcquiredExclusiveToSatisfyAllocation, OMR_GET_CALLSITE(), (void *)this);
119
120
/* STW GC increment */
121
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_INCREMENT_START, verboseHandlerGCStart, OMR_GET_CALLSITE(), (void *)this);
122
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_INCREMENT_END, verboseHandlerGCEnd, OMR_GET_CALLSITE(), (void *)this);
123
124
/* Cycle */
125
(*_mmOmrHooks)->J9HookRegisterWithCallSite(_mmOmrHooks, J9HOOK_MM_OMR_GC_CYCLE_START, verboseHandlerCycleStart, OMR_GET_CALLSITE(), (void *)this);
126
(*_mmOmrHooks)->J9HookRegisterWithCallSite(_mmOmrHooks, J9HOOK_MM_OMR_GC_CYCLE_CONTINUE, verboseHandlerCycleContinue, OMR_GET_CALLSITE(), (void *)this);
127
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_POST_CYCLE_END, verboseHandlerCycleEnd, OMR_GET_CALLSITE(), (void *)this);
128
129
/* Mark */
130
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GMP_MARK_START, verboseHandlerGMPMarkStart, OMR_GET_CALLSITE(), (void *)this);
131
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GMP_MARK_END, verboseHandlerGMPMarkEnd, OMR_GET_CALLSITE(), (void *)this);
132
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_VLHGC_GLOBAL_GC_MARK_START, verboseHandlerGlobalGCMarkStart, OMR_GET_CALLSITE(), (void *)this);
133
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_VLHGC_GLOBAL_GC_MARK_END, verboseHandlerGlobalGCMarkEnd, OMR_GET_CALLSITE(), (void *)this);
134
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_PGC_MARK_START, verboseHandlerPGCMarkStart, OMR_GET_CALLSITE(), (void *)this);
135
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_PGC_MARK_END, verboseHandlerPGCMarkEnd, OMR_GET_CALLSITE(), (void *)this);
136
137
/* Sweep */
138
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_SWEEP_START, verboseHandlerReclaimSweepStart, OMR_GET_CALLSITE(), (void *)this);
139
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_SWEEP_END, verboseHandlerReclaimSweepEnd, OMR_GET_CALLSITE(), (void *)this);
140
141
/* Compact */
142
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_COMPACT_START, verboseHandlerReclaimCompactStart, OMR_GET_CALLSITE(), (void *)this);
143
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_COMPACT_END, verboseHandlerReclaimCompactEnd, OMR_GET_CALLSITE(), (void *)this);
144
145
/* Copy Forward */
146
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COPY_FORWARD_START, verboseHandlerCopyForwardStart, OMR_GET_CALLSITE(), (void *)this);
147
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COPY_FORWARD_END, verboseHandlerCopyForwardEnd, OMR_GET_CALLSITE(), (void *)this);
148
149
/* Concurrent GMP */
150
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_PHASE_START, verboseHandlerConcurrentStart, OMR_GET_CALLSITE(), this);
151
(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_PHASE_END, verboseHandlerConcurrentEnd, OMR_GET_CALLSITE(), this);
152
153
/* Excessive GC */
154
(*_mmOmrHooks)->J9HookRegisterWithCallSite(_mmOmrHooks, J9HOOK_MM_OMR_EXCESSIVEGC_RAISED, verboseHandlerExcessiveGCRaised, OMR_GET_CALLSITE(), this);
155
156
#if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
157
(*_mmHooks)->J9HookRegisterWithCallSite(_mmHooks, J9HOOK_MM_CLASS_UNLOADING_END, verboseHandlerClassUnloadingEnd, OMR_GET_CALLSITE(), (void *)this);
158
#endif /* defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING) */
159
}
160
161
void
162
MM_VerboseHandlerOutputVLHGC::disableVerbose()
163
{
164
MM_VerboseHandlerOutput::disableVerbose();
165
166
/* GCLaunch */
167
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SYSTEM_GC_START, verboseHandlerSystemGCStart, NULL);
168
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SYSTEM_GC_END, verboseHandlerSystemGCEnd, NULL);
169
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ALLOCATION_FAILURE_START, verboseHandlerAllocationFailureStart, NULL);
170
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_FAILED_ALLOCATION_COMPLETED, verboseHandlerFailedAllocationCompleted, NULL);
171
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ALLOCATION_FAILURE_END, verboseHandlerAllocationFailureEnd, NULL);
172
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_TAROK_INCREMENT_START, verboseHandlerTaxationEntryPoint, NULL);
173
174
/* Cycle */
175
(*_mmOmrHooks)->J9HookUnregister(_mmOmrHooks, J9HOOK_MM_OMR_GC_CYCLE_START, verboseHandlerCycleStart, NULL);
176
(*_mmOmrHooks)->J9HookUnregister(_mmOmrHooks, J9HOOK_MM_OMR_GC_CYCLE_CONTINUE, verboseHandlerCycleContinue, NULL);
177
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_POST_CYCLE_END, verboseHandlerCycleEnd, NULL);
178
179
/* STW GC increment */
180
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_INCREMENT_START, verboseHandlerGCStart, NULL);
181
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_INCREMENT_END, verboseHandlerGCEnd, NULL);
182
183
/* Exclusive */
184
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_EXCLUSIVE_ACCESS_ACQUIRE, verboseHandlerExclusiveStart, NULL);
185
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_EXCLUSIVE_ACCESS_RELEASE, verboseHandlerExclusiveEnd, NULL);
186
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ACQUIRED_EXCLUSIVE_TO_SATISFY_ALLOCATION, verboseHandlerAcquiredExclusiveToSatisfyAllocation, NULL);
187
188
/* Mark */
189
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GMP_MARK_START, verboseHandlerGMPMarkStart, NULL);
190
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GMP_MARK_END, verboseHandlerGMPMarkEnd, NULL);
191
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_VLHGC_GLOBAL_GC_MARK_START, verboseHandlerGlobalGCMarkStart, NULL);
192
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_VLHGC_GLOBAL_GC_MARK_END, verboseHandlerGlobalGCMarkEnd, NULL);
193
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_PGC_MARK_START, verboseHandlerPGCMarkStart, NULL);
194
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_PGC_MARK_END, verboseHandlerPGCMarkEnd, NULL);
195
196
/* Sweep */
197
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_SWEEP_START, verboseHandlerReclaimSweepStart, NULL);
198
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_SWEEP_END, verboseHandlerReclaimSweepEnd, NULL);
199
200
/* Compact */
201
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_COMPACT_START, verboseHandlerReclaimCompactStart, NULL);
202
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_RECLAIM_COMPACT_END, verboseHandlerReclaimCompactEnd, NULL);
203
204
/* Copy Forward */
205
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COPY_FORWARD_START, verboseHandlerCopyForwardStart, NULL);
206
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COPY_FORWARD_END, verboseHandlerCopyForwardEnd, NULL);
207
208
/* Concurrent GMP */
209
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_PHASE_START, verboseHandlerConcurrentStart, NULL);
210
(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_PHASE_END, verboseHandlerConcurrentEnd, NULL);
211
212
/* Excessive GC */
213
(*_mmOmrHooks)->J9HookUnregister(_mmOmrHooks, J9HOOK_MM_OMR_EXCESSIVEGC_RAISED, verboseHandlerExcessiveGCRaised, NULL);
214
215
#if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
216
(*_mmHooks)->J9HookUnregister(_mmHooks, J9HOOK_MM_CLASS_UNLOADING_END, verboseHandlerClassUnloadingEnd, NULL);
217
#endif /* defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING) */
218
}
219
220
bool
221
MM_VerboseHandlerOutputVLHGC::getThreadName(char *buf, UDATA bufLen, OMR_VMThread *vmThread)
222
{
223
return MM_VerboseHandlerJava::getThreadName(buf,bufLen,vmThread);
224
}
225
226
void
227
MM_VerboseHandlerOutputVLHGC::writeVmArgs(MM_EnvironmentBase* env, MM_VerboseBuffer* buffer)
228
{
229
MM_VerboseHandlerJava::writeVmArgs(env, buffer, static_cast<J9JavaVM*>(_omrVM->_language_vm));
230
}
231
232
void
233
MM_VerboseHandlerOutputVLHGC::handleTaxationEntryPoint(J9HookInterface** hook, UDATA eventNum, void* eventData)
234
{
235
MM_TarokIncrementStartEvent* event = (MM_TarokIncrementStartEvent*)eventData;
236
MM_VerboseManager* manager = getManager();
237
MM_VerboseWriterChain* writer = manager->getWriterChain();
238
MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);
239
PORT_ACCESS_FROM_ENVIRONMENT(env);
240
U_64 currentTime = event->timestamp;
241
U_64 previousTime = manager->getLastTaxationEntryPointTime();
242
manager->setLastTaxationEntryPointTime(currentTime);
243
if (0 == previousTime) {
244
previousTime = manager->getInitializedTime();
245
}
246
U_64 deltaTime = 0;
247
bool deltaTimeSuccess = getTimeDeltaInMicroSeconds(&deltaTime, previousTime, currentTime);
248
249
char tagTemplate[200];
250
getTagTemplate(tagTemplate, sizeof(tagTemplate), j9time_current_time_millis());
251
enterAtomicReportingBlock();
252
if (!deltaTimeSuccess) {
253
writer->formatAndOutput(env, 0, "<warning details=\"clock error detected, following timing may be inaccurate\" />");
254
}
255
writer->formatAndOutput(env, 0, "<allocation-taxation id=\"%zu\" taxation-threshold=\"%zu\" %s intervalms=\"%llu.%03llu\" />", manager->getIdAndIncrement(), event->taxationThreshold, tagTemplate, deltaTime / 1000 , deltaTime % 1000);
256
writer->flush(env);
257
exitAtomicReportingBlock();
258
}
259
260
void
261
MM_VerboseHandlerOutputVLHGC::outputUnfinalizedInfo(MM_EnvironmentBase *env, UDATA indent, UDATA unfinalizedCandidates, UDATA unfinalizedEnqueued)
262
{
263
if(0 != unfinalizedCandidates) {
264
_manager->getWriterChain()->formatAndOutput(env, indent, "<finalization candidates=\"%zu\" enqueued=\"%zu\" />", unfinalizedCandidates, unfinalizedEnqueued);
265
}
266
}
267
268
void
269
MM_VerboseHandlerOutputVLHGC::outputOwnableSynchronizerInfo(MM_EnvironmentBase *env, UDATA indent, UDATA ownableSynchronizerCandidates, UDATA ownableSynchronizerCleared)
270
{
271
if (0 != ownableSynchronizerCandidates) {
272
_manager->getWriterChain()->formatAndOutput(env, indent, "<ownableSynchronizers candidates=\"%zu\" cleared=\"%zu\" />", ownableSynchronizerCandidates, ownableSynchronizerCleared);
273
}
274
}
275
276
void
277
MM_VerboseHandlerOutputVLHGC::outputReferenceInfo(MM_EnvironmentBase *env, UDATA indent, const char *referenceType, MM_ReferenceStats *referenceStats, UDATA dynamicThreshold, UDATA maxThreshold)
278
{
279
if(0 != referenceStats->_candidates) {
280
if (0 != maxThreshold) {
281
_manager->getWriterChain()->formatAndOutput(env, indent, "<references type=\"%s\" candidates=\"%zu\" cleared=\"%zu\" enqueued=\"%zu\" dynamicThreshold=\"%zu\" maxThreshold=\"%zu\" />",
282
referenceType, referenceStats->_candidates, referenceStats->_cleared, referenceStats->_enqueued, dynamicThreshold, maxThreshold);
283
} else {
284
_manager->getWriterChain()->formatAndOutput(env, indent, "<references type=\"%s\" candidates=\"%zu\" cleared=\"%zu\" enqueued=\"%zu\" />",
285
referenceType, referenceStats->_candidates, referenceStats->_cleared, referenceStats->_enqueued);
286
}
287
}
288
}
289
290
void
291
MM_VerboseHandlerOutputVLHGC::outputInitializedInnerStanza(MM_EnvironmentBase *env, MM_VerboseBuffer *buffer){
292
outputInitializedRegion(env, buffer);
293
}
294
295
void
296
MM_VerboseHandlerOutputVLHGC::printAllocationStats(MM_EnvironmentBase* env)
297
{
298
if (MM_CycleState::CT_GLOBAL_MARK_PHASE != env->_cycleState->_collectionType) {
299
MM_VerboseHandlerOutput::printAllocationStats(env);
300
}
301
}
302
303
bool
304
MM_VerboseHandlerOutputVLHGC::hasOutputMemoryInfoInnerStanza()
305
{
306
return true;
307
}
308
309
const char *
310
MM_VerboseHandlerOutputVLHGC::getSubSpaceType(uintptr_t typeFlags)
311
{
312
const char *subSpaceType = NULL;
313
if (MEMORY_TYPE_NEW == typeFlags) {
314
subSpaceType = "eden";
315
} else {
316
subSpaceType = "total heap";
317
}
318
return subSpaceType;
319
}
320
321
void
322
MM_VerboseHandlerOutputVLHGC::outputMemoryInfoInnerStanza(MM_EnvironmentBase *env, UDATA indent, MM_CollectionStatistics *statsBase)
323
{
324
MM_VerboseWriterChain* writer = _manager->getWriterChain();
325
MM_CollectionStatisticsVLHGC *stats = MM_CollectionStatisticsVLHGC::getCollectionStatistics(statsBase);
326
327
if (0 != stats->_edenHeapSize) {
328
writer->formatAndOutput(env, indent, "<mem type=\"eden\" free=\"%zu\" total=\"%zu\" percent=\"%zu\" />",
329
stats->_edenFreeHeapSize, stats->_edenHeapSize,
330
((UDATA)(((U_64)stats->_edenFreeHeapSize*100) / (U_64)stats->_edenHeapSize)));
331
}
332
333
if (0 != stats->_arrayletReferenceObjects) {
334
writer->formatAndOutput(env, indent, "<arraylet-reference objects=\"%zu\" leaves=\"%zu\" largest=\"%zu\" />",
335
stats->_arrayletReferenceObjects, stats->_arrayletReferenceLeaves, stats->_largestReferenceArraylet);
336
}
337
if (0 != stats->_arrayletPrimitiveObjects) {
338
writer->formatAndOutput(env, indent, "<arraylet-primitive objects=\"%zu\" leaves=\"%zu\" largest=\"%zu\" />",
339
stats->_arrayletPrimitiveObjects, stats->_arrayletPrimitiveLeaves, stats->_largestPrimitiveArraylet);
340
}
341
if (0 != stats->_arrayletUnknownObjects) {
342
writer->formatAndOutput(env, indent, "<arraylet-unknown objects=\"%zu\" leaves=\"%zu\" />",
343
stats->_arrayletUnknownObjects, stats->_arrayletUnknownLeaves);
344
}
345
346
if (0 != stats->_numaNodes) {
347
UDATA total = stats->_commonNumaNodeBytes + stats->_localNumaNodeBytes + stats->_nonLocalNumaNodeBytes;
348
UDATA nonLocalPercent = 0;
349
if (0 != total) {
350
nonLocalPercent = (UDATA)((100 * (U_64)stats->_nonLocalNumaNodeBytes) / ((U_64)total));
351
}
352
writer->formatAndOutput(env, indent, "<numa common=\"%zu\" local=\"%zu\" non-local=\"%zu\" non-local-percent=\"%zu\" />",
353
stats->_commonNumaNodeBytes, stats->_localNumaNodeBytes, stats->_nonLocalNumaNodeBytes, nonLocalPercent);
354
}
355
356
MM_VerboseHandlerJava::outputFinalizableInfo(_manager, env, indent);
357
358
UDATA rememberedSetFreePercent = (UDATA)((100 * (U_64)stats->_rememberedSetBytesFree) / ((U_64)stats->_rememberedSetBytesTotal));
359
360
writer->formatAndOutput(env, indent, "<remembered-set count=\"%zu\" freebytes=\"%zu\" totalbytes=\"%zu\" percent=\"%zu\" regionsoverflowed=\"%zu\" regionsstable=\"%zu\" regionsrebuilding=\"%zu\"/>",
361
stats->_rememberedSetCount, stats->_rememberedSetBytesFree, stats->_rememberedSetBytesTotal, rememberedSetFreePercent,
362
stats->_rememberedSetOverflowedRegionCount, stats->_rememberedSetStableRegionCount, stats->_rememberedSetBeingRebuiltRegionCount);
363
}
364
365
void
366
MM_VerboseHandlerOutputVLHGC::outputRememberedSetClearedInfo(MM_EnvironmentBase *env, MM_InterRegionRememberedSetStats *irrsStats)
367
{
368
_manager->getWriterChain()->formatAndOutput(env, 1, "<remembered-set-cleared processed=\"%zu\" cleared=\"%zu\" durationms=\"%llu.%03.3llu\" />",
369
irrsStats->_clearFromRegionReferencesCardsProcessed,
370
irrsStats->_clearFromRegionReferencesCardsCleared,
371
irrsStats->_clearFromRegionReferencesTimesus / 1000, irrsStats->_clearFromRegionReferencesTimesus % 1000);
372
}
373
374
void
375
MM_VerboseHandlerOutputVLHGC::handleCopyForwardStart(J9HookInterface** hook, UDATA eventNum, void* eventData)
376
{
377
}
378
379
void
380
MM_VerboseHandlerOutputVLHGC::handleCopyForwardEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)
381
{
382
MM_CopyForwardEndEvent * event = (MM_CopyForwardEndEvent *)eventData;
383
MM_VerboseWriterChain* writer = _manager->getWriterChain();
384
MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);
385
MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(env->getOmrVM());
386
MM_CopyForwardStats *copyForwardStats = (MM_CopyForwardStats *)event->copyForwardStats;
387
MM_WorkPacketStats *workPacketStats = (MM_WorkPacketStats *)event->workPacketStats;
388
MM_InterRegionRememberedSetStats *irrsStats = (MM_InterRegionRememberedSetStats *)event->irrsStats;
389
PORT_ACCESS_FROM_ENVIRONMENT(env);
390
U_64 totalTime = 0;
391
bool totalTimeSuccess = getTimeDeltaInMicroSeconds(&totalTime, copyForwardStats->_startTime, copyForwardStats->_endTime);
392
393
char tagTemplate[200];
394
getTagTemplate(tagTemplate, sizeof(tagTemplate), _manager->getIdAndIncrement(), "copy forward", env->_cycleState->_verboseContextID, totalTime, j9time_current_time_millis());
395
enterAtomicReportingBlock();
396
if (!totalTimeSuccess) {
397
writer->formatAndOutput(env, 0, "<warning details=\"clock error detected, following timing may be inaccurate\" />");
398
}
399
writer->formatAndOutput(env, 0, "<gc-op %s>", tagTemplate);
400
401
writer->formatAndOutput(env, 1, "<memory-copied type=\"eden\" objects=\"%zu\" bytes=\"%zu\" bytesdiscarded=\"%zu\" />",
402
copyForwardStats->_copyObjectsEden, copyForwardStats->_copyBytesEden, copyForwardStats->_copyDiscardBytesEden);
403
writer->formatAndOutput(env, 1, "<memory-copied type=\"other\" objects=\"%zu\" bytes=\"%zu\" bytesdiscarded=\"%zu\" />",
404
copyForwardStats->_copyObjectsNonEden, copyForwardStats->_copyBytesNonEden, copyForwardStats->_copyDiscardBytesNonEden);
405
writer->formatAndOutput(env, 1, "<memory-cardclean objects=\"%zu\" bytes=\"%zu\" />",
406
copyForwardStats->_objectsCardClean, copyForwardStats->_bytesCardClean);
407
if(copyForwardStats->_aborted || (0 != copyForwardStats->_nonEvacuateRegionCount)) {
408
writer->formatAndOutput(env, 1, "<memory-traced type=\"eden\" objects=\"%zu\" bytes=\"%zu\" />",
409
copyForwardStats->_scanObjectsEden, copyForwardStats->_scanBytesEden);
410
writer->formatAndOutput(env, 1, "<memory-traced type=\"other\" objects=\"%zu\" bytes=\"%zu\" />",
411
copyForwardStats->_scanObjectsNonEden, copyForwardStats->_scanBytesNonEden);
412
}
413
if (0 == copyForwardStats->_nonEvacuateRegionCount) {
414
writer->formatAndOutput(env, 1, "<regions eden=\"%zu\" other=\"%zu\" />",
415
copyForwardStats->_edenEvacuateRegionCount, copyForwardStats->_nonEdenEvacuateRegionCount);
416
} else {
417
writer->formatAndOutput(env, 1, "<regions eden=\"%zu\" other=\"%zu\" evacuated=\"%zu\" marked=\"%zu\" />",
418
copyForwardStats->_edenEvacuateRegionCount, copyForwardStats->_nonEdenEvacuateRegionCount,
419
(copyForwardStats->_edenEvacuateRegionCount + copyForwardStats->_nonEdenEvacuateRegionCount - copyForwardStats->_nonEvacuateRegionCount),
420
copyForwardStats->_nonEvacuateRegionCount);
421
}
422
outputRememberedSetClearedInfo(env, irrsStats);
423
424
outputUnfinalizedInfo(env, 1, copyForwardStats->_unfinalizedCandidates, copyForwardStats->_unfinalizedEnqueued);
425
outputOwnableSynchronizerInfo(env, 1, copyForwardStats->_ownableSynchronizerCandidates, (copyForwardStats->_ownableSynchronizerCandidates-copyForwardStats->_ownableSynchronizerSurvived));
426
427
outputReferenceInfo(env, 1, "soft", &copyForwardStats->_softReferenceStats, extensions->getDynamicMaxSoftReferenceAge(), extensions->getMaxSoftReferenceAge());
428
outputReferenceInfo(env, 1, "weak", &copyForwardStats->_weakReferenceStats, 0, 0);
429
outputReferenceInfo(env, 1, "phantom", &copyForwardStats->_phantomReferenceStats, 0, 0);
430
431
outputStringConstantInfo(env, 1, copyForwardStats->_stringConstantsCandidates, copyForwardStats->_stringConstantsCleared);
432
outputMonitorReferenceInfo(env, 1, copyForwardStats->_monitorReferenceCandidates, copyForwardStats->_monitorReferenceCleared);
433
434
if(0 != copyForwardStats->_heapExpandedCount) {
435
U_64 expansionMicros = j9time_hires_delta(0, copyForwardStats->_heapExpandedTime, J9PORT_TIME_DELTA_IN_MICROSECONDS);
436
outputCollectorHeapResizeInfo(env, 1, HEAP_EXPAND, copyForwardStats->_heapExpandedBytes, copyForwardStats->_heapExpandedCount, MEMORY_TYPE_OLD, SATISFY_COLLECTOR, expansionMicros);
437
}
438
439
if(copyForwardStats->_scanCacheOverflow) {
440
writer->formatAndOutput(env, 1, "<warning details=\"scan cache overflow (storage acquired from heap)\" />");
441
}
442
443
if(copyForwardStats->_aborted) {
444
writer->formatAndOutput(env, 1, "<warning details=\"operation aborted due to insufficient free space\" />");
445
}
446
447
if(workPacketStats->getSTWWorkStackOverflowOccured()) {
448
writer->formatAndOutput(env, 1, "<warning details=\"work packet overflow\" count=\"%zu\" packetcount=\"%zu\" />",
449
workPacketStats->getSTWWorkStackOverflowCount(), workPacketStats->getSTWWorkpacketCountAtOverflow());
450
}
451
452
writer->formatAndOutput(env, 0, "</gc-op>");
453
writer->flush(env);
454
exitAtomicReportingBlock();
455
}
456
457
void
458
MM_VerboseHandlerOutputVLHGC::handleConcurrentStartInternal(J9HookInterface** hook, UDATA eventNum, void* eventData)
459
{
460
MM_ConcurrentPhaseEndEvent *event = (MM_ConcurrentPhaseEndEvent *)eventData;
461
MM_ConcurrentPhaseStatsBase *stats = (MM_ConcurrentPhaseStatsBase *)event->concurrentStats;
462
MM_VerboseWriterChain* writer = _manager->getWriterChain();
463
MM_EnvironmentBase *env = MM_EnvironmentBase::getEnvironment(event->currentThread);
464
465
writer->formatAndOutput(env, 1, "<concurrent-mark-start scanTarget=\"%zu\" />", stats->_scanTargetInBytes);
466
}
467
468
void
469
MM_VerboseHandlerOutputVLHGC::handleConcurrentEndInternal(J9HookInterface** hook, UDATA eventNum, void* eventData)
470
{
471
MM_ConcurrentPhaseEndEvent *event = (MM_ConcurrentPhaseEndEvent *)eventData;
472
MM_ConcurrentPhaseStatsBase *stats = (MM_ConcurrentPhaseStatsBase *)event->concurrentStats;
473
MM_VerboseWriterChain* writer = _manager->getWriterChain();
474
MM_EnvironmentBase *env = MM_EnvironmentBase::getEnvironment(event->currentThread);
475
476
uint64_t duration = 0;
477
MM_MarkVLHGCStats *markStats = &static_cast<MM_CycleStateVLHGC*>(env->_cycleState)->_vlhgcIncrementStats._markStats;
478
bool deltaTimeSuccess = getTimeDeltaInMicroSeconds(&duration, markStats->_startTime, markStats->_endTime);
479
480
handleGCOPOuterStanzaStart(env, "mark increment", stats->_cycleID, duration, deltaTimeSuccess);
481
482
UDATA bytesScanned = stats->_bytesScanned;
483
writer->formatAndOutput(env, 1, "<trace-info scanbytes=\"%zu\" />", bytesScanned);
484
handleGCOPOuterStanzaEnd(env);
485
}
486
487
void
488
MM_VerboseHandlerOutputVLHGC::handleGMPMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData)
489
{
490
/* No implementation */
491
}
492
493
void
494
MM_VerboseHandlerOutputVLHGC::handleGMPMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)
495
{
496
MM_GMPMarkEndEvent * event = (MM_GMPMarkEndEvent *)eventData;
497
MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);
498
MM_MarkVLHGCStats *markStats = (MM_MarkVLHGCStats *)event->markStats;
499
MM_WorkPacketStats *workPacketStats = (MM_WorkPacketStats *)event->workPacketStats;
500
501
outputMarkSummary(env, "mark increment", markStats, workPacketStats, NULL);
502
}
503
504
void
505
MM_VerboseHandlerOutputVLHGC::handleGlobalGCMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData)
506
{
507
/* No implementation */
508
}
509
510
void
511
MM_VerboseHandlerOutputVLHGC::handleGlobalGCMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)
512
{
513
MM_VLHGCGlobalGCMarkEndEvent * event = (MM_VLHGCGlobalGCMarkEndEvent *)eventData;
514
MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);
515
MM_MarkVLHGCStats *markStats = (MM_MarkVLHGCStats *)event->markStats;
516
MM_WorkPacketStats *workPacketStats = (MM_WorkPacketStats *)event->workPacketStats;
517
518
outputMarkSummary(env, "global mark", markStats, workPacketStats, NULL);
519
}
520
521
void
522
MM_VerboseHandlerOutputVLHGC::handlePGCMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData)
523
{
524
/* No implementation */
525
}
526
527
void
528
MM_VerboseHandlerOutputVLHGC::handlePGCMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)
529
{
530
MM_PGCMarkEndEvent * event = (MM_PGCMarkEndEvent *)eventData;
531
MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);
532
MM_MarkVLHGCStats *markStats = (MM_MarkVLHGCStats *)event->markStats;
533
MM_WorkPacketStats *workPacketStats = (MM_WorkPacketStats *)event->workPacketStats;
534
MM_InterRegionRememberedSetStats *irrsStats = (MM_InterRegionRememberedSetStats *)event->irrsStats;
535
536
outputMarkSummary(env, "mark", markStats, workPacketStats, irrsStats);
537
}
538
539
void
540
MM_VerboseHandlerOutputVLHGC::outputMarkSummary(MM_EnvironmentBase *env, const char *markType, MM_MarkVLHGCStats *markStats, MM_WorkPacketStats *workPacketStats, MM_InterRegionRememberedSetStats *irrsStats)
541
{
542
MM_VerboseWriterChain* writer = _manager->getWriterChain();
543
MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(env->getOmrVM());
544
545
PORT_ACCESS_FROM_ENVIRONMENT(env);
546
547
U_64 totalTime = 0;
548
bool totalTimeSuccess = getTimeDeltaInMicroSeconds(&totalTime, markStats->_startTime, markStats->_endTime);
549
550
char tagTemplate[200];
551
getTagTemplate(tagTemplate, sizeof(tagTemplate), _manager->getIdAndIncrement(), markType, env->_cycleState->_verboseContextID, totalTime, j9time_current_time_millis());
552
enterAtomicReportingBlock();
553
if (!totalTimeSuccess) {
554
writer->formatAndOutput(env, 0, "<warning details=\"clock error detected, following timing may be inaccurate\" />");
555
}
556
writer->formatAndOutput(env, 0, "<gc-op %s>", tagTemplate);
557
558
writer->formatAndOutput(env, 1, "<trace-info objectcount=\"%zu\" scancount=\"%zu\" scanbytes=\"%zu\" />",
559
markStats->_objectsMarked, markStats->_objectsScanned, markStats->_bytesScanned);
560
561
if (0 != markStats->_objectsCardClean) {
562
writer->formatAndOutput(env, 1, "<cardclean-info objects=\"%zu\" bytes=\"%zu\" />",
563
markStats->_objectsCardClean, markStats->_bytesCardClean);
564
}
565
566
if (NULL != irrsStats) {
567
/* report only for PGC */
568
outputRememberedSetClearedInfo(env, irrsStats);
569
}
570
571
outputUnfinalizedInfo(env, 1, markStats->_unfinalizedCandidates, markStats->_unfinalizedEnqueued);
572
outputOwnableSynchronizerInfo(env, 1, markStats->_ownableSynchronizerCandidates, markStats->_ownableSynchronizerCleared);
573
574
outputReferenceInfo(env, 1, "soft", &markStats->_softReferenceStats, extensions->getDynamicMaxSoftReferenceAge(), extensions->getMaxSoftReferenceAge());
575
outputReferenceInfo(env, 1, "weak", &markStats->_weakReferenceStats, 0, 0);
576
outputReferenceInfo(env, 1, "phantom", &markStats->_phantomReferenceStats, 0, 0);
577
578
outputStringConstantInfo(env, 1, markStats->_stringConstantsCandidates, markStats->_stringConstantsCleared);
579
outputMonitorReferenceInfo(env, 1, markStats->_monitorReferenceCandidates, markStats->_monitorReferenceCleared);
580
581
switch (env->_cycleState->_reasonForMarkCompactPGC) {
582
case MM_CycleState::reason_not_exceptional:
583
/* nothing to report */
584
break;
585
case MM_CycleState::reason_JNI_critical_in_Eden:
586
writer->formatAndOutput(env, 1, "<warning details=\"Mark invoked due to active JNI critical regions\" />");
587
break;
588
case MM_CycleState::reason_calibration:
589
writer->formatAndOutput(env, 1, "<warning details=\"Mark for calibration purposes\" />");
590
break;
591
case MM_CycleState::reason_recent_abort:
592
writer->formatAndOutput(env, 1, "<warning details=\"Mark invoked due to recent Copy-Forward abort\" />");
593
break;
594
case MM_CycleState::reason_insufficient_free_space:
595
writer->formatAndOutput(env, 1, "<warning details=\"Mark invoked due to insufficient free space for Copy-Forward\" />");
596
break;
597
default:
598
writer->formatAndOutput(env, 1, "<warning details=\"Unknown reason for Mark-Compact collect: %zu\" />", (UDATA)env->_cycleState->_reasonForMarkCompactPGC);
599
break;
600
}
601
602
if(workPacketStats->getSTWWorkStackOverflowOccured()) {
603
writer->formatAndOutput(env, 1, "<warning details=\"work packet overflow\" count=\"%zu\" packetcount=\"%zu\" />",
604
workPacketStats->getSTWWorkStackOverflowCount(), workPacketStats->getSTWWorkpacketCountAtOverflow());
605
}
606
607
writer->formatAndOutput(env, 0, "</gc-op>");
608
writer->flush(env);
609
exitAtomicReportingBlock();
610
}
611
612
void
613
MM_VerboseHandlerOutputVLHGC::handleReclaimSweepStart(J9HookInterface** hook, UDATA eventNum, void* eventData)
614
{
615
/* No implementation */
616
}
617
618
void
619
MM_VerboseHandlerOutputVLHGC::handleReclaimSweepEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)
620
{
621
MM_ReclaimSweepEndEvent * event = (MM_ReclaimSweepEndEvent *)eventData;
622
MM_VerboseWriterChain* writer = _manager->getWriterChain();
623
MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);
624
MM_SweepVLHGCStats *sweepStats = (MM_SweepVLHGCStats *)event->sweepStats;
625
PORT_ACCESS_FROM_ENVIRONMENT(env);
626
U_64 totalTime = 0;
627
bool totalTimeSuccess = getTimeDeltaInMicroSeconds(&totalTime, sweepStats->_startTime, sweepStats->_endTime);
628
629
char tagTemplate[200];
630
getTagTemplate(tagTemplate, sizeof(tagTemplate), _manager->getIdAndIncrement(), "sweep", env->_cycleState->_verboseContextID, totalTime, j9time_current_time_millis());
631
enterAtomicReportingBlock();
632
if (!totalTimeSuccess) {
633
writer->formatAndOutput(env, 0, "<warning details=\"clock error detected, following timing may be inaccurate\" />");
634
}
635
writer->formatAndOutput(env, 0, "<gc-op %s />", tagTemplate);
636
writer->flush(env);
637
exitAtomicReportingBlock();
638
}
639
640
void
641
MM_VerboseHandlerOutputVLHGC::handleReclaimCompactStart(J9HookInterface** hook, UDATA eventNum, void* eventData)
642
{
643
/* No implementation */
644
}
645
646
void
647
MM_VerboseHandlerOutputVLHGC::handleReclaimCompactEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)
648
{
649
MM_ReclaimCompactEndEvent * event = (MM_ReclaimCompactEndEvent *)eventData;
650
MM_VerboseWriterChain* writer = _manager->getWriterChain();
651
MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment(event->currentThread);
652
MM_CompactVLHGCStats *compactStats = (MM_CompactVLHGCStats *)event->compactStats;
653
MM_InterRegionRememberedSetStats *irrsStats = (MM_InterRegionRememberedSetStats *)event->irrsStats;
654
PORT_ACCESS_FROM_ENVIRONMENT(env);
655
U_64 totalTime = 0;
656
bool totalTimeSuccess = getTimeDeltaInMicroSeconds(&totalTime, compactStats->_startTime, compactStats->_endTime);
657
658
char tagTemplate[200];
659
getTagTemplate(tagTemplate, sizeof(tagTemplate), _manager->getIdAndIncrement(), "compact", env->_cycleState->_verboseContextID, totalTime, j9time_current_time_millis());
660
enterAtomicReportingBlock();
661
if (!totalTimeSuccess) {
662
writer->formatAndOutput(env, 0, "<warning details=\"clock error detected, following timing may be inaccurate\" />");
663
}
664
writer->formatAndOutput(env, 0, "<gc-op %s>", tagTemplate);
665
writer->formatAndOutput(env, 1, "<compact-info movecount=\"%zu\" movebytes=\"%zu\" />", compactStats->_movedObjects, compactStats->_movedBytes);
666
667
outputRememberedSetClearedInfo(env, irrsStats);
668
669
writer->formatAndOutput(env, 0, "</gc-op>");
670
writer->flush(env);
671
exitAtomicReportingBlock();
672
}
673
674
void
675
MM_VerboseHandlerOutputVLHGC::handleClassUnloadEnd(J9HookInterface** hook, UDATA eventNum, void* eventData)
676
{
677
MM_ClassUnloadingEndEvent* event = (MM_ClassUnloadingEndEvent*)eventData;
678
MM_EnvironmentBase* env = MM_EnvironmentBase::getEnvironment((OMR_VMThread *)event->currentThread->omrVMThread);
679
MM_VerboseManager* manager = getManager();
680
MM_VerboseWriterChain* writer = manager->getWriterChain();
681
MM_ClassUnloadStats *classUnloadStats = &static_cast<MM_CycleStateVLHGC*>(env->_cycleState)->_vlhgcIncrementStats._classUnloadStats;
682
PORT_ACCESS_FROM_ENVIRONMENT(env);
683
U_64 totalTime = 0;
684
bool totalTimeSuccess = getTimeDeltaInMicroSeconds(&totalTime, classUnloadStats->_startTime, classUnloadStats->_endTime);
685
686
char tagTemplate[200];
687
getTagTemplate(tagTemplate, sizeof(tagTemplate), _manager->getIdAndIncrement(), "classunload", env->_cycleState->_verboseContextID, totalTime, j9time_current_time_millis());
688
enterAtomicReportingBlock();
689
if (!totalTimeSuccess) {
690
writer->formatAndOutput(env, 0, "<warning details=\"clock error detected, following timing may be inaccurate\" />");
691
}
692
writer->formatAndOutput(env, 0, "<gc-op %s>", tagTemplate);
693
694
695
UDATA classLoaderUnloadedCount = classUnloadStats->_classLoaderUnloadedCount;
696
UDATA classLoaderCandidates = classUnloadStats->_classLoaderCandidates;
697
UDATA classesUnloadedCount = classUnloadStats->_classesUnloadedCount;
698
UDATA anonymousClassesUnloadedCount = classUnloadStats->_anonymousClassesUnloadedCount;
699
700
U_64 setupTime = 0;
701
bool partialTimeSuccess = getTimeDeltaInMicroSeconds(&setupTime, classUnloadStats->_startSetupTime, classUnloadStats->_endSetupTime);
702
U_64 scanTime = 0;
703
partialTimeSuccess = (partialTimeSuccess && getTimeDeltaInMicroSeconds(&scanTime, classUnloadStats->_startScanTime, classUnloadStats->_endScanTime));
704
U_64 postTime = 0;
705
partialTimeSuccess = (partialTimeSuccess && getTimeDeltaInMicroSeconds(&postTime, classUnloadStats->_startPostTime, classUnloadStats->_endPostTime));
706
/* !!!Note: classUnloadStats->_classUnloadMutexQuiesceTime is in us already, do not convert it again!!!*/
707
U_64 quiesceTime = classUnloadStats->_classUnloadMutexQuiesceTime;
708
709
writer->formatAndOutput(
710
env, 1,
711
"<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\" />",
712
classLoaderCandidates, classLoaderUnloadedCount, classesUnloadedCount, anonymousClassesUnloadedCount,
713
quiesceTime / 1000, quiesceTime % 1000,
714
setupTime / 1000, setupTime % 1000,
715
scanTime / 1000, scanTime % 1000,
716
postTime / 1000, postTime % 1000);
717
718
if (!partialTimeSuccess) {
719
writer->formatAndOutput(env, 1, "<warning details=\"clock error detected, previous timing may be inaccurate\" />");
720
}
721
722
writer->formatAndOutput(env, 0, "</gc-op>");
723
writer->flush(env);
724
exitAtomicReportingBlock();
725
}
726
727
const char *
728
MM_VerboseHandlerOutputVLHGC::getCycleType(UDATA type)
729
{
730
const char *cycleType = NULL;
731
732
switch (type) {
733
case OMR_GC_CYCLE_TYPE_VLHGC_PARTIAL_GARBAGE_COLLECT:
734
cycleType = "partial gc";
735
break;
736
case OMR_GC_CYCLE_TYPE_VLHGC_GLOBAL_MARK_PHASE:
737
cycleType = "global mark phase";
738
break;
739
case OMR_GC_CYCLE_TYPE_VLHGC_GLOBAL_GARBAGE_COLLECT:
740
cycleType = "global garbage collect";
741
break;
742
default:
743
cycleType = "unknown";
744
break;
745
}
746
747
return cycleType;
748
}
749
750
const char *
751
MM_VerboseHandlerOutputVLHGC::getConcurrentTerminationReason(MM_ConcurrentPhaseStatsBase *stats)
752
{
753
const char *reasonForTermination = NULL;
754
UDATA bytesScanned = stats->_bytesScanned;
755
bool didComplete = bytesScanned >= stats->_scanTargetInBytes;
756
757
if (stats->_terminationWasRequested) {
758
if (didComplete) {
759
reasonForTermination = "Work target met and termination requested";
760
} else {
761
reasonForTermination = "Termination requested";
762
}
763
} else {
764
if (didComplete) {
765
reasonForTermination = "Work target met";
766
} else {
767
reasonForTermination = "Completed all work in GC phase";
768
}
769
}
770
771
return reasonForTermination;
772
}
773
774
void
775
verboseHandlerTaxationEntryPoint(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
776
{
777
((MM_VerboseHandlerOutputVLHGC *)userData)->handleTaxationEntryPoint(hook, eventNum, eventData);
778
}
779
780
void
781
verboseHandlerGCStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
782
{
783
((MM_VerboseHandlerOutput *)userData)->handleGCStart(hook, eventNum, eventData);
784
}
785
786
void
787
verboseHandlerGCEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
788
{
789
((MM_VerboseHandlerOutput *)userData)->handleGCEnd(hook, eventNum, eventData);
790
}
791
792
void
793
verboseHandlerCycleStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
794
{
795
((MM_VerboseHandlerOutput *)userData)->handleCycleStart(hook, eventNum, eventData);
796
}
797
798
void
799
verboseHandlerCycleContinue(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
800
{
801
((MM_VerboseHandlerOutput *)userData)->handleCycleContinue(hook, eventNum, eventData);
802
}
803
804
void
805
verboseHandlerCycleEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
806
{
807
((MM_VerboseHandlerOutput *)userData)->handleCycleEnd(hook, eventNum, eventData);
808
}
809
810
void
811
verboseHandlerExclusiveStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
812
{
813
((MM_VerboseHandlerOutput*)userData)->handleExclusiveStart(hook, eventNum, eventData);
814
}
815
816
void
817
verboseHandlerExclusiveEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
818
{
819
((MM_VerboseHandlerOutput*)userData)->handleExclusiveEnd(hook, eventNum, eventData);
820
}
821
822
void
823
verboseHandlerSystemGCStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
824
{
825
((MM_VerboseHandlerOutput *)userData)->handleSystemGCStart(hook, eventNum, eventData);
826
}
827
828
void
829
verboseHandlerSystemGCEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
830
{
831
((MM_VerboseHandlerOutput *)userData)->handleSystemGCEnd(hook, eventNum, eventData);
832
}
833
834
void
835
verboseHandlerAllocationFailureStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
836
{
837
((MM_VerboseHandlerOutput *)userData)->handleAllocationFailureStart(hook, eventNum, eventData);
838
}
839
840
void
841
verboseHandlerFailedAllocationCompleted(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
842
{
843
((MM_VerboseHandlerOutput *)userData)->handleFailedAllocationCompleted(hook, eventNum, eventData);
844
}
845
846
void
847
verboseHandlerAllocationFailureEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
848
{
849
((MM_VerboseHandlerOutput *)userData)->handleAllocationFailureEnd(hook, eventNum, eventData);
850
}
851
852
void
853
verboseHandlerCopyForwardStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
854
{
855
((MM_VerboseHandlerOutputVLHGC *)userData)->handleCopyForwardStart(hook, eventNum, eventData);
856
}
857
858
void
859
verboseHandlerCopyForwardEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
860
{
861
((MM_VerboseHandlerOutputVLHGC *)userData)->handleCopyForwardEnd(hook, eventNum, eventData);
862
}
863
864
void
865
verboseHandlerConcurrentStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
866
{
867
((MM_VerboseHandlerOutput *)userData)->handleConcurrentStart(hook, eventNum, eventData);
868
}
869
870
void
871
verboseHandlerConcurrentEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
872
{
873
((MM_VerboseHandlerOutput *)userData)->handleConcurrentEnd(hook, eventNum, eventData);
874
}
875
876
void
877
verboseHandlerGMPMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
878
{
879
((MM_VerboseHandlerOutputVLHGC *)userData)->handleGMPMarkStart(hook, eventNum, eventData);
880
}
881
882
void
883
verboseHandlerGMPMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
884
{
885
((MM_VerboseHandlerOutputVLHGC *)userData)->handleGMPMarkEnd(hook, eventNum, eventData);
886
}
887
888
void
889
verboseHandlerGlobalGCMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
890
{
891
((MM_VerboseHandlerOutputVLHGC *)userData)->handleGlobalGCMarkStart(hook, eventNum, eventData);
892
}
893
894
void
895
verboseHandlerGlobalGCMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
896
{
897
((MM_VerboseHandlerOutputVLHGC *)userData)->handleGlobalGCMarkEnd(hook, eventNum, eventData);
898
}
899
900
void
901
verboseHandlerPGCMarkStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
902
{
903
((MM_VerboseHandlerOutputVLHGC *)userData)->handlePGCMarkStart(hook, eventNum, eventData);
904
}
905
906
void
907
verboseHandlerPGCMarkEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
908
{
909
((MM_VerboseHandlerOutputVLHGC *)userData)->handlePGCMarkEnd(hook, eventNum, eventData);
910
}
911
912
void
913
verboseHandlerReclaimSweepStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
914
{
915
((MM_VerboseHandlerOutputVLHGC *)userData)->handleReclaimSweepStart(hook, eventNum, eventData);
916
}
917
918
void
919
verboseHandlerReclaimSweepEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
920
{
921
((MM_VerboseHandlerOutputVLHGC *)userData)->handleReclaimSweepEnd(hook, eventNum, eventData);
922
}
923
924
void
925
verboseHandlerReclaimCompactStart(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
926
{
927
((MM_VerboseHandlerOutputVLHGC *)userData)->handleReclaimCompactStart(hook, eventNum, eventData);
928
}
929
930
void
931
verboseHandlerReclaimCompactEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
932
{
933
((MM_VerboseHandlerOutputVLHGC *)userData)->handleReclaimCompactEnd(hook, eventNum, eventData);
934
}
935
936
void
937
verboseHandlerExcessiveGCRaised(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
938
{
939
((MM_VerboseHandlerOutputVLHGC *)userData)->handleExcessiveGCRaised(hook, eventNum, eventData);
940
}
941
942
void verboseHandlerAcquiredExclusiveToSatisfyAllocation(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
943
{
944
((MM_VerboseHandlerOutputVLHGC *)userData)->handleAcquiredExclusiveToSatisfyAllocation(hook, eventNum, eventData);
945
}
946
947
#if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
948
void verboseHandlerClassUnloadingEnd(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
949
{
950
((MM_VerboseHandlerOutputVLHGC *)userData)->handleClassUnloadEnd(hook, eventNum, eventData);
951
}
952
#endif /* defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING) */
953
954
955