Path: blob/master/runtime/gc_check/CheckEngine.hpp
5990 views
1/*******************************************************************************2* Copyright (c) 1991, 2019 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/**24* @file25* @ingroup GC_CheckEngine26*/2728#if !defined(CHECKENGINE_HPP_)29#define CHECKENGINE_HPP_3031#include "j9.h"32#include "j9cfg.h"3334#include "Base.hpp"35#include "CheckBase.hpp"36#include "CheckReporter.hpp"37#include "CheckElement.hpp"38#include "HeapIteratorAPI.h"39#include "MemorySpace.hpp"4041class GC_CheckCycle;42class GC_FinalizeList;43class GC_ScanFormatter;44class GC_VMThreadIterator;45class MM_SublistPool;46class MM_SublistPuddle;4748/**49* Check GC structures.50* Validate the object and class heap. Then validate pointers, flags and other51* structures used by garbage collection.52* @ingroup GC_CheckEngine53*/54class GC_CheckEngine : public MM_Base55{56/*57* Data members58*/59private:60J9JavaVM *_javaVM;61J9PortLibrary *_portLibrary;62GC_CheckReporter *_reporter; /**< Device to report errors to */63GC_CheckCycle *_cycle; /**< Object holding the details of the current check cycle */64GC_Check *_currentCheck; /**< The check current being run */65GC_CheckElement _lastHeapObject1; /**< The last object visited */66GC_CheckElement _lastHeapObject2; /**< The last object visited */67GC_CheckElement _lastHeapObject3; /**< The last object visited */68J9MM_IterateRegionDescriptor _regionDesc; /**< The last region found for an object */69enum { CLASS_CACHE_SIZE = 19 }; /**< The size of the checked class caches (a prime number) */70J9Class *_checkedClassCache[CLASS_CACHE_SIZE]; /**< A cache of recently checked classes, guaranteed not to be undead */71J9Class *_checkedClassCacheAllowUndead[CLASS_CACHE_SIZE]; /**< A cache of recently checked classes, including checked undead classes */72enum { OBJECT_CACHE_SIZE = 61 }; /**< The size of the checked object caches (a prime number) */73J9Object *_checkedObjectCache[OBJECT_CACHE_SIZE]; /**< A cache of recently checked objects */7475#define UNINITIALIZED_SIZE_FOR_OWNABLESYNCHRONIER ((UDATA)-1)76UDATA _ownableSynchronizerObjectCountOnList; /**< the count of ownableSynchronizerObjects on the ownableSynchronizerLists, =UNINITIALIZED_SIZE_FOR_OWNABLESYNCHRONIER indicates that the count has not been calculated */77UDATA _ownableSynchronizerObjectCountOnHeap; /**< the count of ownableSynchronizerObjects on the heap, =UNINITIALIZED_SIZE_FOR_OWNABLESYNCHRONIER indicates that the count has not been calculated */7879protected:8081public:82#if defined(J9VM_GC_MODRON_SCAVENGER)83bool _scavengerBackout; /**< flag for whether a scavenge backout occurred or not */84bool _rsOverflowState; /**< flag for whether remembered set is in overflow state or not */85#endif /* J9VM_GC_MODRON_SCAVENGER */8687/*88* Function members89*/90private:91bool isPointerInSegment(void *pointer, J9MemorySegment *segment);92bool isObjectOnStack(J9Object *objectPtr, J9JavaStack *stack);93J9MemorySegment* findSegmentForClass(J9JavaVM *javaVM, J9Class *clazz);9495bool findRegionForPointer(J9JavaVM* javaVM, void* pointer, J9MM_IterateRegionDescriptor* regionDescOutput);96UDATA checkJ9ObjectPointer(J9JavaVM *javaVM, J9Object *objectPtr, J9Object **newObjectPtr, J9MM_IterateRegionDescriptor *regionDesc);97UDATA checkJ9Object(J9JavaVM *javaVM, J9Object* objectPtr, J9MM_IterateRegionDescriptor *regionDesc, UDATA checkFlags);98UDATA checkObjectIndirect(J9JavaVM *javaVM, J9Object *objectPtr);99100UDATA checkJ9Class(J9JavaVM *javaVM, J9Class *clazz, J9MemorySegment *segment, UDATA checkFlags);101UDATA checkJ9ClassHeader(J9JavaVM *javaVM, J9Class *clazz);102UDATA checkStackObject(J9JavaVM *javaVM, J9Object *objectPtr);103UDATA checkJ9ClassIsNotUnloaded(J9JavaVM *javaVM, J9Class *clazz);104105/**106* Check correctness of class ramStatics.107* Generate messages about discovered problems.108* @param vm - javaVM109* @param clazz - class to scan110* @return successful operation complete code or error code111*/112UDATA checkClassStatics(J9JavaVM* vm, J9Class* clazz);113114/**115* Clear the cache of classes and objects which have already been checked in this cycle.116*/117void clearCheckedCache();118119bool initialize(void);120121protected:122123public:124MMINLINE J9JavaVM *getJavaVM() { return _javaVM; };125126void clearPreviousObjects();127void pushPreviousObject(J9Object *objectPtr);128void pushPreviousClass(J9Class *clazz);129130void clearCountsForOwnableSynchronizerObjects();131bool verifyOwnableSynchronizerObjectCounts();132MMINLINE void initializeOwnableSynchronizerCountOnList() { _ownableSynchronizerObjectCountOnList = 0; };133MMINLINE void initializeOwnableSynchronizerCountOnHeap() { _ownableSynchronizerObjectCountOnHeap = 0; };134135UDATA checkObjectHeap(J9JavaVM *javaVM, J9MM_IterateObjectDescriptor *objectDesc, J9MM_IterateRegionDescriptor *regionDesc);136UDATA checkSlotObjectHeap(J9JavaVM *javaVM, J9Object *objectPtr, fj9object_t *objectIndirect, J9MM_IterateRegionDescriptor *regionDesc, J9Object *objectIndirectBase);137UDATA checkSlotVMThread(J9JavaVM *javaVM, J9Object **objectIndirect, void *objectIndirectBase, UDATA objectType, GC_VMThreadIterator *vmthreadIterator);138UDATA checkSlotStack(J9JavaVM *javaVM, J9Object **objectIndirect, J9VMThread *vmThread, const void *stackLocation);139UDATA checkSlotRememberedSet(J9JavaVM *javaVM, J9Object **objectIndirect, MM_SublistPuddle *puddle);140UDATA checkSlotUnfinalizedList(J9JavaVM *javaVM, J9Object **objectIndirect, MM_UnfinalizedObjectList *currentList);141142/**143* Verify a ownableSynchronizer object list slot.144*145* @param objectIndirect the slot to be verified146* @param currentList the ownableSynchronizerObjectList which contains the slot147*148* @return #J9MODRON_SLOT_ITERATOR_OK149*/150UDATA checkSlotOwnableSynchronizerList(J9JavaVM *javaVM, J9Object **objectIndirect, MM_OwnableSynchronizerObjectList *currentList);151UDATA checkSlotFinalizableList(J9JavaVM *javaVM, J9Object **objectIndirect, GC_FinalizeListManager *listManager);152UDATA checkSlotPool(J9JavaVM *javaVM, J9Object **objectIndirect, void *objectIndirectBase);153UDATA checkClassHeap(J9JavaVM *javaVM, J9Class *clazz, J9MemorySegment *segment);154UDATA checkJ9ClassPointer(J9JavaVM *javaVM, J9Class *clazz, bool allowUndead = false);155156157static GC_CheckEngine *newInstance(J9JavaVM *javaVM, GC_CheckReporter *reporter);158void kill();159160void startCheckCycle(J9JavaVM *javaVM, GC_CheckCycle *checkCycle);161void endCheckCycle(J9JavaVM *javaVM);162void startNewCheck(GC_Check *check);163bool isStackDumpAlwaysDisplayed();164void copyRegionDescription(J9MM_IterateRegionDescriptor* from, J9MM_IterateRegionDescriptor* to);165void clearRegionDescription(J9MM_IterateRegionDescriptor* toClear);166167/**168* Set an upper limit on how many errors are reported.169* Any errors that are encountered after this limit is reached will not be reported.170* @param count the maximum number of errors to report171*/172MMINLINE void setMaxErrorsToReport(UDATA count) { _reporter->setMaxErrorsToReport(count); };173174GC_CheckEngine(J9JavaVM *javaVM, GC_CheckReporter *reporter)175: MM_Base()176, _javaVM(javaVM)177, _portLibrary(javaVM->portLibrary)178, _reporter(reporter)179, _cycle(NULL)180, _currentCheck(NULL)181, _lastHeapObject1()182, _lastHeapObject2()183, _lastHeapObject3()184, _ownableSynchronizerObjectCountOnList(UNINITIALIZED_SIZE_FOR_OWNABLESYNCHRONIER)185, _ownableSynchronizerObjectCountOnHeap(UNINITIALIZED_SIZE_FOR_OWNABLESYNCHRONIER)186#if defined(J9VM_GC_MODRON_SCAVENGER)187, _scavengerBackout(false)188, _rsOverflowState(false)189#endif /* J9VM_GC_MODRON_SCAVENGER */190{}191};192193#endif /* CHECKENGINE_HPP_ */194195196