Open pshipton opened 1 year ago
@dmitripivkine fyi
All starts when GC expected !j9class 0x48814400
but this area in the class segment is zeroed:
0x488142E0 : 48814400 00000031 3e4e7100 00000021 [ H.D....1>Nq....! ]
0x488142F0 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814300 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814310 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814320 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814330 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814340 : 3d357b00 00000031 3d690300 00000031 [ =5{....1=i.....1 ]
0x48814350 : 3e4e8200 00000031 3d353000 00000421 [ >N.....1=50....! ]
0x48814360 : 3d632000 00000421 00000000 00000000 [ =c ....!........ ]
0x48814370 : 47fc323c 488141e0 00000006 00000001 [ G.2<H.A......... ]
0x48814380 : 47fc3268 488141e0 00000006 00000001 [ G.2hH.A......... ]
0x48814390 : 47fc3294 488141e0 00000018 4b2803f8 [ G.2.H.A.....K(.. ]
0x488143A0 : 47fc32d0 488141e0 00000018 4b2413f4 [ G.2.H.A.....K$.. ]
0x488143B0 : 47fc34f8 488141e0 00000000 00000000 [ G.4.H.A......... ]
0x488143C0 : 00000000 00000000 00000000 00000000 [ ................ ]
0x488143D0 : 00000000 00000000 00000000 00000000 [ ................ ]<--- !j9itable 0x488143D8 for !j9class 0x48814b00
0x488143E0 : 00000000 00000000 00000000 00000000 [ ................ ]
0x488143F0 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814400 : 00000000 00000000 00000000 00000000 [ ................ ]<--- expected j9class here
0x48814410 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814420 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814430 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814440 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814450 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814460 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814470 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814480 : 00000000 00000000 00000000 00000000 [ ................ ]
0x48814490 : 00000000 00000000 00000000 00000000 [ ................ ]
0x488144A0 : 00000000 00000000 00000000 00000000 [ ................ ]
0x488144B0 : 00000000 00000000 00000000 00000005 [ ................ ]
0x488144C0 : 19ef82b8 19ef8ae8 3e4e71fc 3e4e720c [ ........>Nq.>Nr. ]
0x488144D0 : 3e4e721c 3e4e723c 3e4e726c 4804f9e0 [ >Nr.>Nr<>NrlH... ]
0x488144E0 : 48814a00 47fc3a30 48814a00 00000021 [ H.J.G.:0H.J....! ]
0x488144F0 : 80000000 00000000 007fffff 00000000 [ ................ ]
0x48814500 : 7f800000 00000000 00800000 00000000 [ ................ ]
0x48814510 : 00000000 00000000 1c58ad68 00000000 [ .........X.h.... ]
0x48814520 : 1c7bda10 00000000 00000000 00000000 [ .{.............. ]
This is zOS-31, so first 2K [0,0x800] of virtual memory is available to read. GC code failure starts with dereferencing NULL and ends up at NULL->0x7c0
0x000007B0 : 55f007e4 474007bc 41f00030 5ef007e0 [ U...G@..A..0^... ]
0x000007C0 : acfb04a3 58f0f000 0cefad04 04a318e0 [ ....X........... ] <----
0x000007D0 : 0b0e0000 00000000 00000000 00000000 [ ................ ]
interpreting 0xacfb04a3
as an object pointer.
Looks like this class use to be valid (?). I found class object for it, I am not sure why all fields except classLoader
are zeroes
> !j9object 0x1C915F98
!J9Object 0x1C915F98 {
struct J9Class* clazz = !j9class 0x3E4EAB00 // java/lang/Class
Object flags = 0x0000000A;
I lockword = 0x00000000 (offset = 0) (java/lang/Object) <hidden>
J vmRef = 0x0000000048814400 (offset = 4) (java/lang/Class) <-------
Ljava/lang/ClassLoader; classLoader = !fj9object 0x1c5233b8 (offset = 12) (java/lang/Class)
Ljava/security/ProtectionDomain; protectionDomain = !fj9object 0x0 (offset = 16) (java/lang/Class)
Ljava/lang/String; classNameString = !fj9object 0x0 (offset = 20) (java/lang/Class)
Ljava/lang/String; cachedToString = !fj9object 0x0 (offset = 24) (java/lang/Class)
Ljava/lang/String; fileNameString = !fj9object 0x0 (offset = 28) (java/lang/Class)
Ljava/lang/String; packageNameString = !fj9object 0x0 (offset = 32) (java/lang/Class)
Ljava/lang/Class$AnnotationVars; annotationVars = !fj9object 0x0 (offset = 36) (java/lang/Class)
Ljava/lang/ClassValue$ClassValueMap; classValueMap = !fj9object 0x0 (offset = 40) (java/lang/Class)
Ljava/lang/Class$EnumVars; enumVars = !fj9object 0x0 (offset = 44) (java/lang/Class)
Ljava/lang/J9VMInternals$ClassInitializationLock; initializationLock = !fj9object 0x0 (offset = 48) (java/lang/Class)
Ljava/lang/Object; methodHandleCache = !fj9object 0x0 (offset = 52) (java/lang/Class)
Ljava/lang/Class$ClassRepositoryHolder; classRepoHolder = !fj9object 0x0 (offset = 56) (java/lang/Class)
Ljava/lang/Class$AnnotationCache; annotationCache = !fj9object 0x0 (offset = 60) (java/lang/Class)
Ljava/lang/Class$MetadataCache; metadataCache = !fj9object 0x0 (offset = 64) (java/lang/Class)
[Ljava/lang/Class; cachedInterfaces = !fj9object 0x0 (offset = 68) (java/lang/Class)
Ljava/lang/Class; cachedDeclaringClass = !fj9object 0x0 (offset = 72) (java/lang/Class)
Ljava/lang/Class; cachedEnclosingClass = !fj9object 0x0 (offset = 76) (java/lang/Class)
Z cachedCheckInnerClassAttr = 0x00000000 (offset = 84) (java/lang/Class)
Ljava/lang/Class$ReflectCache; reflectCache = !fj9object 0x0 (offset = 80) (java/lang/Class)
}
If there is general memory corruption unrelated with memory content it is very hard to find obviously. There is another observation: I noticed next class in the memory
> !j9class 0x48814b00
J9Class at 0x48814b00 {
Fields for J9Class:
0x0: UDATA eyecatcher = 0x99669966 (2573637990)
0x4: struct J9ROMClass * romClass = !j9romclass 0x47FC65D8
0x8: struct J9Class ** superclasses = !j9x 0x48814ADC
0xc: UDATA classDepthAndFlags = 0x001E0001 (1966081)
0x10: U32 classDepthWithFlags = 0x00000000 (0)
0x14: U32 classFlags = 0x00000000 (0)
0x18: struct J9ClassLoader * classLoader = !j9classloader 0x1C4DB3E0
0x1c: j9object_t classObject = !j9object 0x1C7C51B8 // java/lang/Class
0x20: volatile UDATA initializeStatus = 0x00000000 (0) <-------------------------
0x24: struct J9Method * ramMethods = !j9method 0x48814BD0 // sun/misc/FloatingDecimal$BinaryToASCIIConverter.toJavaFormatString()Ljava/lang/String;
0x28: UDATA * ramStatics = !j9x 0x00000000
0x2c: struct J9Class * arrayClass = !j9class 0x00000000
0x30: UDATA totalInstanceSize = 0x00000008 (8)
0x34: struct J9ITable * lastITable = !j9itable 0x488143D8 <------------------------
0x38: UDATA * instanceDescription = !j9x 0x00000001
0x3c: UDATA * instanceLeafDescription = !j9x 0x00000001
0x40: UDATA instanceHotFieldDescription = 0x00000000 (0)
0x44: UDATA selfReferencingField1 = 0x00000000 (0)
0x48: UDATA selfReferencingField2 = 0x00000000 (0)
0x4c: struct J9Method * initializerCache = !j9method 0x00000000
0x50: UDATA romableAotITable = 0x1A1BBCE0 (438025440)
0x54: UDATA packageID = 0x3D32BDA9 (1026735529)
0x58: struct J9Module * module = !j9module 0x00000000
0x5c: struct J9Class * subclassTraversalLink = !j9class 0x48814A00 // sun/misc/FloatingDecimal
0x60: struct J9Class * subclassTraversalReverseLink = !j9class 0x48814D00 // sun/misc/FloatingDecimal$ExceptionalBinaryToASCIIBuffer
0x64: void ** iTable = !j9x 0x488143D8 <------------------------
0x68: UDATA castClassCache = 0x00000000 (0)
0x6c: void ** jniIDs = !j9x 0x00000000
0x70: UDATA lockOffset = 0x00000004 (4)
0x74: U16 reservedCounter = 0x0000 (0)
0x76: U16 cancelCounter = 0x0000 (0)
0x78: UDATA newInstanceCount = 0x00000000 (0)
0x7c: IDATA backfillOffset = 0x00000008 (8)
0x80: struct J9Class * replacedClass = !j9class 0x00000000
0x84: UDATA finalizeLinkOffset = 0x00000000 (0)
0x88: struct J9Class * nextClassInSegment = !j9class 0x48814A00 // sun/misc/FloatingDecimal
0x8c: UDATA* ramConstantPool = !j9x 0x4804C7D0
0x90: j9object_t * callSites = !j9x 0x00000000
0x94: j9object_t * methodTypes = !j9x 0x00000000
0x98: j9object_t * varHandleMethodTypes = !j9x 0x00000000
0x9c: struct J9VMCustomSpinOptions * customSpinOption = !j9vmcustomspinoptions 0x00000000
0xa0: struct J9Method ** staticSplitMethodTable = !j9x 0x00000000
0xa4: struct J9Method ** specialSplitMethodTable = !j9x 0x00000000
0xa8: struct J9JITExceptionTable * jitMetaDataList = !j9jitexceptiontable 0x00000000
0xac: struct J9Class * gcLink = !j9class 0x00000000
0xb0: struct J9Class * hostClass = !j9class 0x48814B00 // sun/misc/FloatingDecimal$BinaryToASCIIConverter
0xb4: struct J9FlattenedClassCache * flattenedClassCache = !j9flattenedclasscache 0x00000000
0xb8: struct J9ClassHotFieldsInfo * hotFieldsInfo = !j9classhotfieldsinfo 0x00000000
}
Class name: sun/misc/FloatingDecimal$BinaryToASCIIConverter
To view static fields, use !j9statics 0x48814B00
To view instance shape, use !j9classshape 0x48814B00
> !j9itable 0x488143D8
J9ITable at 0x488143d8 {
Fields for J9ITable:
0x0: struct J9Class * interfaceClass = !j9class 0x00000000
0x4: UDATA depth = 0x00000000 (0)
0x8: struct J9ITable * next = !j9itable 0x00000000
}
has initializeStatus = 0x00000000
. If it is not a corruption as well it might mean an initialization of this class has not been complete. Also please notice iTable = !j9x 0x488143D8
points to the same zeroed chunk as well (normally this section should not contain zeroes, at least by GC expectations).
I wondering what if problematic memory range was zeroed during initialization of !j9class 0x48814b00
some time after point !j9itable 0x488143D8
was created and set to the j9class?
This theory does not explain why class object !j9object 0x1C915F98
for !j9class 0x48814400
is full of zeroes however.
Core is loaded to /team/dmitri/16646/J9BUILD.JVM.TDUMP.J9BUILD9.D230201.T104824
@tajila @pshipton FYI. I will dig around a little bit more with hope to discover something
GC Check discovered two more problems in this core - class pointer in O-slot:
Checking THREAD STACKS...
<gc check (5): from debugger: THREAD STACKS: slot 414f1e00(1ca7eca8) -> 3d5a2500: object slot appears to contain a J9Class pointer>
<gc check (6): from debugger: THREAD STACKS: slot 45a29200(1ca7eca8) -> 3d5a2500: object slot appears to contain a J9Class pointer>
> !stackslots 0x414f1e00
<414f1e00> *** BEGIN STACK WALK, flags = 00400001 walkThread = 0x414F1E00 ***
<414f1e00> ITERATE_O_SLOTS
<414f1e00> RECORD_BYTECODE_PC_OFFSET
<414f1e00> Initial values: walkSP = 0x47E0F178, PC = 0x00000008, literals = 0x00000004, A0 = 0x47E0F1A4, j2iFrame = 0x47E0F200, ELS = 0x42258808, decomp = 0x00000000
<414f1e00> MethodType frame: bp = 0x47E0F194, sp = 0x47E0F178, pc = 0x00000008, cp = 0x00000000, arg0EA = 0x47E0F1A4, flags = 0x00000000
<414f1e00> Object pushes starting at 0x47E0F178 for 1 slots
<414f1e00> Push[0x47E0F178] = 0x1C9152E0
<414f1e00> O-Slot[0x1CA7ECA8] = 0x3D5A2500 <-----
<414f1e00> O-Slot: a0[0x47E0F1A4] = 0x38B2B048
<414f1e00> I-Slot: a1[0x47E0F1A0] = 0x00000000
<414f1e00> I-Slot: a2[0x47E0F19C] = 0x00000000
<414f1e00> invokeExact J2I frame: bp = 0x47E0F200, sp = 0x47E0F1A8, pc = 0x19EF7264, cp = 0x00000000, arg0EA = 0x47E0F200, flags = 0x10000000
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1F0] = UDATA(0x38B2B070) (jit_r6)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1EC] = UDATA(0x1CA7ECA8) (jit_r7)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1E8] = UDATA(0x1C9BD620) (jit_r8)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1E4] = UDATA(0x1A1B49D8) (jit_r9)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1E0] = UDATA(0x00000000) (jit_r10)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1DC] = UDATA(0x00000000) (jit_r11)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1D8] = UDATA(0x3D34D400) (jit_r12)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1D4] = UDATA(0x3E4EB300) (jit_r22)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1D0] = UDATA(0x00000000) (jit_r23)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1CC] = UDATA(0x00000000) (jit_r24)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1C8] = UDATA(0x00000000) (jit_r25)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1C4] = UDATA(0x00000000) (jit_r26)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1C0] = UDATA(0x0000005E) (jit_r27)
<414f1e00> JIT-J2I-RegisterMap[0x47E0F1BC] = UDATA(0x00100000) (jit_r28)
<414f1e00> JIT frame: bp = 0x47E0F26C, pc = 0x49FFEE74, unwindSP = 0x47E0F1F8, cp = 0x3E6132F0, arg0EA = 0x47E0F274, jitInfo = 0x49C7F1C8
<414f1e00> Method: com/ibm/jtc/svt/tests/invoke/StaticAsTypeTestExplicit.testConvertLong(J)V !j9method 0x3E6143A0
<414f1e00> Bytecode index = 632, inlineDepth = 0, PC offset = 0x0000067C
<414f1e00> stackMap=0x49C7FF9C, slots=I16(0x0002) parmBaseOffset=I16(0x000C), parmSlots=U16(0x0000), localBaseOffset=I16(0xFFEC)
<414f1e00> Described JIT temps starting at 0x47E0F258 for IDATA(0x00000005) slots
......
> !stackslots 0x45a29200
<45a29200> *** BEGIN STACK WALK, flags = 00400001 walkThread = 0x45A29200 ***
<45a29200> ITERATE_O_SLOTS
<45a29200> RECORD_BYTECODE_PC_OFFSET
<45a29200> Initial values: walkSP = 0x480C1680, PC = 0x00000008, literals = 0x00000004, A0 = 0x480C16AC, j2iFrame = 0x480C1708, ELS = 0x45F92808, decomp = 0x00000000
<45a29200> MethodType frame: bp = 0x480C169C, sp = 0x480C1680, pc = 0x00000008, cp = 0x00000000, arg0EA = 0x480C16AC, flags = 0x00000000
<45a29200> Object pushes starting at 0x480C1680 for 1 slots
<45a29200> Push[0x480C1680] = 0x1C9152E0
<45a29200> O-Slot[0x1CA7ECA8] = 0x3D5A2500 <-----
<45a29200> O-Slot: a0[0x480C16AC] = 0x38B47D30
<45a29200> I-Slot: a1[0x480C16A8] = 0x00000000
<45a29200> I-Slot: a2[0x480C16A4] = 0x00000000
<45a29200> invokeExact J2I frame: bp = 0x480C1708, sp = 0x480C16B0, pc = 0x19EF7264, cp = 0x00000000, arg0EA = 0x480C1708, flags = 0x10000000
<45a29200> JIT-J2I-RegisterMap[0x480C16F8] = UDATA(0x38B47D58) (jit_r6)
<45a29200> JIT-J2I-RegisterMap[0x480C16F4] = UDATA(0x1CA7ECA8) (jit_r7)
<45a29200> JIT-J2I-RegisterMap[0x480C16F0] = UDATA(0x1C9BD620) (jit_r8)
<45a29200> JIT-J2I-RegisterMap[0x480C16EC] = UDATA(0x1A1B49D8) (jit_r9)
<45a29200> JIT-J2I-RegisterMap[0x480C16E8] = UDATA(0x00000000) (jit_r10)
<45a29200> JIT-J2I-RegisterMap[0x480C16E4] = UDATA(0x00000000) (jit_r11)
<45a29200> JIT-J2I-RegisterMap[0x480C16E0] = UDATA(0x3EC95BA8) (jit_r12)
<45a29200> JIT-J2I-RegisterMap[0x480C16DC] = UDATA(0x00000000) (jit_r22)
<45a29200> JIT-J2I-RegisterMap[0x480C16D8] = UDATA(0x00000000) (jit_r23)
<45a29200> JIT-J2I-RegisterMap[0x480C16D4] = UDATA(0x00000000) (jit_r24)
<45a29200> JIT-J2I-RegisterMap[0x480C16D0] = UDATA(0x00000000) (jit_r25)
<45a29200> JIT-J2I-RegisterMap[0x480C16CC] = UDATA(0x00000000) (jit_r26)
<45a29200> JIT-J2I-RegisterMap[0x480C16C8] = UDATA(0x00000000) (jit_r27)
<45a29200> JIT-J2I-RegisterMap[0x480C16C4] = UDATA(0x00100000) (jit_r28)
<45a29200> JIT frame: bp = 0x480C1774, pc = 0x49FFEE74, unwindSP = 0x480C1700, cp = 0x3E6132F0, arg0EA = 0x480C177C, jitInfo = 0x49C7F1C8
<45a29200> Method: com/ibm/jtc/svt/tests/invoke/StaticAsTypeTestExplicit.testConvertLong(J)V !j9method 0x3E6143A0
<45a29200> Bytecode index = 632, inlineDepth = 0, PC offset = 0x0000067C
<45a29200> stackMap=0x49C7FF9C, slots=I16(0x0002) parmBaseOffset=I16(0x000C), parmSlots=U16(0x0000), localBaseOffset=I16(0xFFEC)
<45a29200> Described JIT temps starting at 0x480C1760 for IDATA(0x00000005) slots
!j9class 0x3D5A2500
is a class for java/lang/invoke/MethodType
Internal build [zOS S390] 80 Load_Level_2.abbs.5mins.Mode112 - labec16 IBM_JAVA_OPTIONS = -Xgcpolicy:gencon -Xjit:count=0 -Xnocompressedrefs
50x grinder passed
I couldn't recreate the failure, but just in case, the change from previous build https://github.com/eclipse/omr/pull/6847