use of com.ibm.j9ddr.vm29.j9.gc.GCClassHeapIterator in project openj9 by eclipse.
the class RootScanner method scanPermanentClasses.
protected void scanPermanentClasses() throws CorruptDataException {
J9ClassLoaderPointer sysClassLoader = _vm.systemClassLoader();
J9ClassLoaderPointer appClassLoader = J9ClassLoaderPointer.cast(_vm.applicationClassLoader());
GCSegmentIterator segmentIterator = GCSegmentIterator.fromJ9MemorySegmentList(_vm.classMemorySegments(), J9MemorySegment.MEMORY_TYPE_RAM_CLASS);
setReachability(Reachability.STRONG);
while (segmentIterator.hasNext()) {
J9MemorySegmentPointer segment = segmentIterator.next();
if (segment.classLoader().equals(sysClassLoader) || segment.classLoader().equals(appClassLoader)) {
GCClassHeapIterator classHeapIterator = GCClassHeapIterator.fromJ9MemorySegment(segment);
while (classHeapIterator.hasNext()) {
doClass(classHeapIterator.next());
}
}
}
}
use of com.ibm.j9ddr.vm29.j9.gc.GCClassHeapIterator in project openj9 by eclipse.
the class VmCheckCommand method checkJ9ClassSanity.
/*
* Based on vmchk/checkclasses.c r1.7
*
* J9Class sanity:
* Eyecatcher check:
* Ensure J9Class->eyecatcher == 0x99669966.
*
* Superclasses check:
* Ensure J9Class->superclasses != null unless J9Class is Object.
*
* ClassObject null check:
* Ensure J9Class->classObject != null if (J9Class->initializeStatus == J9ClassInitSucceeded)
*
* ClassLoader segment check:
* Ensure J9Class->classLoader->classSegments contains J9Class.
*
* ConstantPool check:
* Ensure J9Class->ramConstantPool->ramClass is equal to the J9Class.
*
* Subclass hierarchy check:
* Ensure subclasses can be traversed per the J9Class classDepth.
*
* Obsolete class check:
* Ensure obsolete classes are found in the replacedClass linked list on the currentClass.
*/
private void checkJ9ClassSanity(J9JavaVMPointer javaVM, PrintStream out) throws CorruptDataException {
reportMessage(out, "Checking classes");
// Stolen from RootScaner.scanClasses()
// GCClassLoaderIterator gcClassLoaderIterator =
// GCClassLoaderIterator.from();
GCSegmentIterator segmentIterator = GCSegmentIterator.fromJ9MemorySegmentList(javaVM.classMemorySegments(), J9MemorySegment.MEMORY_TYPE_RAM_CLASS);
int count = 0;
int obsoleteCount = 0;
while (segmentIterator.hasNext()) {
J9MemorySegmentPointer segment = segmentIterator.next();
GCClassHeapIterator classHeapIterator = GCClassHeapIterator.fromJ9MemorySegment(segment);
while (classHeapIterator.hasNext()) {
J9ClassPointer clazz = classHeapIterator.next();
if (!J9ClassHelper.isObsolete(clazz)) {
verifyJ9Class(javaVM, out, clazz);
} else {
verifyObsoleteJ9Class(javaVM, out, clazz);
obsoleteCount++;
}
count++;
}
}
reportMessage(out, "Checking %d classes (%d obsolete) done", count, obsoleteCount);
}
use of com.ibm.j9ddr.vm29.j9.gc.GCClassHeapIterator in project openj9 by eclipse.
the class VmCheckCommand method checkJ9MethodSanity.
/*
* Based on vmchk/checkmethods.c r1.5
*
* J9Method sanity:
* Bytecode check:
* Ensure (bytecodes - sizeof(J9ROMMethod) is in the right "area" to be a ROM Method.
* Use ROMClass to determine where ROM methods for that class begin.
* Constant pool check:
* Ensure method's constant pool is the same as that of its J9Class.
* Useful to validate that HCR doesn't violate this invariant.
* VTable check:
* If method of a non-interface class has modifier J9AccMethodVTable,
* ensure it exists in the VTable of its J9Class.
* Useful to validate that HCR doesn't violate this invariant.
*/
private void checkJ9MethodSanity(J9JavaVMPointer vm, PrintStream out) throws CorruptDataException {
reportMessage(out, "Checking methods");
// Stolen from RootScaner.scanClasses()
// GCClassLoaderIterator gcClassLoaderIterator =
// GCClassLoaderIterator.from();
GCSegmentIterator segmentIterator = GCSegmentIterator.fromJ9MemorySegmentList(vm.classMemorySegments(), J9MemorySegment.MEMORY_TYPE_RAM_CLASS);
int count = 0;
while (segmentIterator.hasNext()) {
J9MemorySegmentPointer segment = segmentIterator.next();
GCClassHeapIterator classHeapIterator = GCClassHeapIterator.fromJ9MemorySegment(segment);
while (classHeapIterator.hasNext()) {
J9ClassPointer clazz = classHeapIterator.next();
if (!J9ClassHelper.isObsolete(clazz)) {
count += verifyClassMethods(vm, out, clazz);
}
}
}
reportMessage(out, "Checking %d methods done", count);
}
use of com.ibm.j9ddr.vm29.j9.gc.GCClassHeapIterator in project openj9 by eclipse.
the class CheckClassHeap method check.
@Override
public void check() {
try {
GCSegmentIterator segmentIterator = GCSegmentIterator.fromJ9MemorySegmentList(_javaVM.classMemorySegments(), J9MemorySegment.MEMORY_TYPE_RAM_CLASS);
while (segmentIterator.hasNext()) {
J9MemorySegmentPointer segment = segmentIterator.next();
_engine.clearPreviousObjects();
GCClassHeapIterator classHeapIterator = GCClassHeapIterator.fromJ9MemorySegment(segment);
while (classHeapIterator.hasNext()) {
J9ClassPointer clazz = classHeapIterator.next();
if (_engine.checkClassHeap(clazz, segment) != CheckBase.J9MODRON_SLOT_ITERATOR_OK) {
return;
}
_engine.pushPreviousClass(clazz);
}
}
} catch (CorruptDataException e) {
// TODO: handle exception
}
}
use of com.ibm.j9ddr.vm29.j9.gc.GCClassHeapIterator in project openj9 by eclipse.
the class RootScanner method scanClasses.
protected void scanClasses() throws CorruptDataException {
J9ClassLoaderPointer sysClassLoader = _vm.systemClassLoader();
J9ClassLoaderPointer appClassLoader = J9ClassLoaderPointer.cast(_vm.applicationClassLoader());
GCSegmentIterator segmentIterator = GCSegmentIterator.fromJ9MemorySegmentList(_vm.classMemorySegments(), J9MemorySegment.MEMORY_TYPE_RAM_CLASS);
while (segmentIterator.hasNext()) {
J9MemorySegmentPointer segment = segmentIterator.next();
GCClassHeapIterator classHeapIterator = GCClassHeapIterator.fromJ9MemorySegment(segment);
while (classHeapIterator.hasNext()) {
J9ClassPointer clazz = classHeapIterator.next();
Reachability reachability;
if (J9BuildFlags.gc_dynamicClassUnloading) {
long dynamicClassUnloadingFlag = _extensions.dynamicClassUnloading();
if (MM_GCExtensions$DynamicClassUnloading.DYNAMIC_CLASS_UNLOADING_NEVER == dynamicClassUnloadingFlag) {
reachability = Reachability.STRONG;
} else {
if (clazz.classLoader().eq(sysClassLoader) || clazz.classLoader().eq(appClassLoader)) {
reachability = Reachability.STRONG;
} else {
reachability = Reachability.WEAK;
}
}
} else {
reachability = Reachability.STRONG;
}
setReachability(reachability);
doClass(clazz);
}
}
}
Aggregations