Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/gc_check/CheckEngine.hpp
5990 views
1
2
/*******************************************************************************
3
* Copyright (c) 1991, 2019 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
/**
25
* @file
26
* @ingroup GC_CheckEngine
27
*/
28
29
#if !defined(CHECKENGINE_HPP_)
30
#define CHECKENGINE_HPP_
31
32
#include "j9.h"
33
#include "j9cfg.h"
34
35
#include "Base.hpp"
36
#include "CheckBase.hpp"
37
#include "CheckReporter.hpp"
38
#include "CheckElement.hpp"
39
#include "HeapIteratorAPI.h"
40
#include "MemorySpace.hpp"
41
42
class GC_CheckCycle;
43
class GC_FinalizeList;
44
class GC_ScanFormatter;
45
class GC_VMThreadIterator;
46
class MM_SublistPool;
47
class MM_SublistPuddle;
48
49
/**
50
* Check GC structures.
51
* Validate the object and class heap. Then validate pointers, flags and other
52
* structures used by garbage collection.
53
* @ingroup GC_CheckEngine
54
*/
55
class GC_CheckEngine : public MM_Base
56
{
57
/*
58
* Data members
59
*/
60
private:
61
J9JavaVM *_javaVM;
62
J9PortLibrary *_portLibrary;
63
GC_CheckReporter *_reporter; /**< Device to report errors to */
64
GC_CheckCycle *_cycle; /**< Object holding the details of the current check cycle */
65
GC_Check *_currentCheck; /**< The check current being run */
66
GC_CheckElement _lastHeapObject1; /**< The last object visited */
67
GC_CheckElement _lastHeapObject2; /**< The last object visited */
68
GC_CheckElement _lastHeapObject3; /**< The last object visited */
69
J9MM_IterateRegionDescriptor _regionDesc; /**< The last region found for an object */
70
enum { CLASS_CACHE_SIZE = 19 }; /**< The size of the checked class caches (a prime number) */
71
J9Class *_checkedClassCache[CLASS_CACHE_SIZE]; /**< A cache of recently checked classes, guaranteed not to be undead */
72
J9Class *_checkedClassCacheAllowUndead[CLASS_CACHE_SIZE]; /**< A cache of recently checked classes, including checked undead classes */
73
enum { OBJECT_CACHE_SIZE = 61 }; /**< The size of the checked object caches (a prime number) */
74
J9Object *_checkedObjectCache[OBJECT_CACHE_SIZE]; /**< A cache of recently checked objects */
75
76
#define UNINITIALIZED_SIZE_FOR_OWNABLESYNCHRONIER ((UDATA)-1)
77
UDATA _ownableSynchronizerObjectCountOnList; /**< the count of ownableSynchronizerObjects on the ownableSynchronizerLists, =UNINITIALIZED_SIZE_FOR_OWNABLESYNCHRONIER indicates that the count has not been calculated */
78
UDATA _ownableSynchronizerObjectCountOnHeap; /**< the count of ownableSynchronizerObjects on the heap, =UNINITIALIZED_SIZE_FOR_OWNABLESYNCHRONIER indicates that the count has not been calculated */
79
80
protected:
81
82
public:
83
#if defined(J9VM_GC_MODRON_SCAVENGER)
84
bool _scavengerBackout; /**< flag for whether a scavenge backout occurred or not */
85
bool _rsOverflowState; /**< flag for whether remembered set is in overflow state or not */
86
#endif /* J9VM_GC_MODRON_SCAVENGER */
87
88
/*
89
* Function members
90
*/
91
private:
92
bool isPointerInSegment(void *pointer, J9MemorySegment *segment);
93
bool isObjectOnStack(J9Object *objectPtr, J9JavaStack *stack);
94
J9MemorySegment* findSegmentForClass(J9JavaVM *javaVM, J9Class *clazz);
95
96
bool findRegionForPointer(J9JavaVM* javaVM, void* pointer, J9MM_IterateRegionDescriptor* regionDescOutput);
97
UDATA checkJ9ObjectPointer(J9JavaVM *javaVM, J9Object *objectPtr, J9Object **newObjectPtr, J9MM_IterateRegionDescriptor *regionDesc);
98
UDATA checkJ9Object(J9JavaVM *javaVM, J9Object* objectPtr, J9MM_IterateRegionDescriptor *regionDesc, UDATA checkFlags);
99
UDATA checkObjectIndirect(J9JavaVM *javaVM, J9Object *objectPtr);
100
101
UDATA checkJ9Class(J9JavaVM *javaVM, J9Class *clazz, J9MemorySegment *segment, UDATA checkFlags);
102
UDATA checkJ9ClassHeader(J9JavaVM *javaVM, J9Class *clazz);
103
UDATA checkStackObject(J9JavaVM *javaVM, J9Object *objectPtr);
104
UDATA checkJ9ClassIsNotUnloaded(J9JavaVM *javaVM, J9Class *clazz);
105
106
/**
107
* Check correctness of class ramStatics.
108
* Generate messages about discovered problems.
109
* @param vm - javaVM
110
* @param clazz - class to scan
111
* @return successful operation complete code or error code
112
*/
113
UDATA checkClassStatics(J9JavaVM* vm, J9Class* clazz);
114
115
/**
116
* Clear the cache of classes and objects which have already been checked in this cycle.
117
*/
118
void clearCheckedCache();
119
120
bool initialize(void);
121
122
protected:
123
124
public:
125
MMINLINE J9JavaVM *getJavaVM() { return _javaVM; };
126
127
void clearPreviousObjects();
128
void pushPreviousObject(J9Object *objectPtr);
129
void pushPreviousClass(J9Class *clazz);
130
131
void clearCountsForOwnableSynchronizerObjects();
132
bool verifyOwnableSynchronizerObjectCounts();
133
MMINLINE void initializeOwnableSynchronizerCountOnList() { _ownableSynchronizerObjectCountOnList = 0; };
134
MMINLINE void initializeOwnableSynchronizerCountOnHeap() { _ownableSynchronizerObjectCountOnHeap = 0; };
135
136
UDATA checkObjectHeap(J9JavaVM *javaVM, J9MM_IterateObjectDescriptor *objectDesc, J9MM_IterateRegionDescriptor *regionDesc);
137
UDATA checkSlotObjectHeap(J9JavaVM *javaVM, J9Object *objectPtr, fj9object_t *objectIndirect, J9MM_IterateRegionDescriptor *regionDesc, J9Object *objectIndirectBase);
138
UDATA checkSlotVMThread(J9JavaVM *javaVM, J9Object **objectIndirect, void *objectIndirectBase, UDATA objectType, GC_VMThreadIterator *vmthreadIterator);
139
UDATA checkSlotStack(J9JavaVM *javaVM, J9Object **objectIndirect, J9VMThread *vmThread, const void *stackLocation);
140
UDATA checkSlotRememberedSet(J9JavaVM *javaVM, J9Object **objectIndirect, MM_SublistPuddle *puddle);
141
UDATA checkSlotUnfinalizedList(J9JavaVM *javaVM, J9Object **objectIndirect, MM_UnfinalizedObjectList *currentList);
142
143
/**
144
* Verify a ownableSynchronizer object list slot.
145
*
146
* @param objectIndirect the slot to be verified
147
* @param currentList the ownableSynchronizerObjectList which contains the slot
148
*
149
* @return #J9MODRON_SLOT_ITERATOR_OK
150
*/
151
UDATA checkSlotOwnableSynchronizerList(J9JavaVM *javaVM, J9Object **objectIndirect, MM_OwnableSynchronizerObjectList *currentList);
152
UDATA checkSlotFinalizableList(J9JavaVM *javaVM, J9Object **objectIndirect, GC_FinalizeListManager *listManager);
153
UDATA checkSlotPool(J9JavaVM *javaVM, J9Object **objectIndirect, void *objectIndirectBase);
154
UDATA checkClassHeap(J9JavaVM *javaVM, J9Class *clazz, J9MemorySegment *segment);
155
UDATA checkJ9ClassPointer(J9JavaVM *javaVM, J9Class *clazz, bool allowUndead = false);
156
157
158
static GC_CheckEngine *newInstance(J9JavaVM *javaVM, GC_CheckReporter *reporter);
159
void kill();
160
161
void startCheckCycle(J9JavaVM *javaVM, GC_CheckCycle *checkCycle);
162
void endCheckCycle(J9JavaVM *javaVM);
163
void startNewCheck(GC_Check *check);
164
bool isStackDumpAlwaysDisplayed();
165
void copyRegionDescription(J9MM_IterateRegionDescriptor* from, J9MM_IterateRegionDescriptor* to);
166
void clearRegionDescription(J9MM_IterateRegionDescriptor* toClear);
167
168
/**
169
* Set an upper limit on how many errors are reported.
170
* Any errors that are encountered after this limit is reached will not be reported.
171
* @param count the maximum number of errors to report
172
*/
173
MMINLINE void setMaxErrorsToReport(UDATA count) { _reporter->setMaxErrorsToReport(count); };
174
175
GC_CheckEngine(J9JavaVM *javaVM, GC_CheckReporter *reporter)
176
: MM_Base()
177
, _javaVM(javaVM)
178
, _portLibrary(javaVM->portLibrary)
179
, _reporter(reporter)
180
, _cycle(NULL)
181
, _currentCheck(NULL)
182
, _lastHeapObject1()
183
, _lastHeapObject2()
184
, _lastHeapObject3()
185
, _ownableSynchronizerObjectCountOnList(UNINITIALIZED_SIZE_FOR_OWNABLESYNCHRONIER)
186
, _ownableSynchronizerObjectCountOnHeap(UNINITIALIZED_SIZE_FOR_OWNABLESYNCHRONIER)
187
#if defined(J9VM_GC_MODRON_SCAVENGER)
188
, _scavengerBackout(false)
189
, _rsOverflowState(false)
190
#endif /* J9VM_GC_MODRON_SCAVENGER */
191
{}
192
};
193
194
#endif /* CHECKENGINE_HPP_ */
195
196