Skip to content

Excessive locking in TypeCachingBytecodeGenerator#BOOTSTRAP_LOCK #3035

@aswath80

Description

@aswath80

The TypeCachingBytecodeGenerator#BOOTSTRAP_LOCK is resulting in excessive BLOCKED threads when running several thousand tests concurrently. Byte-buddy TypeCache's findOrInsert without monitor seems to handle concurrency. Is this global lock needed ?

Mockito-Inline 4.10, Byte-Buddy 1.12.19

"ForkJoinPool-1-worker-84" Id=115 RUNNABLE (daemon=TRUE) at [email protected]/java.lang.StringLatin1.replace(StringLatin1.java:322) at [email protected]/java.lang.String.replace(String.java:2806) at app//net.bytebuddy.jar.asm.Type.getInternalName(Type.java:510) at app//net.bytebuddy.jar.asm.Type.appendDescriptor(Type.java:644) at app//net.bytebuddy.jar.asm.Type.getMethodDescriptor(Type.java:585) at app//net.bytebuddy.description.method.MethodDescription$ForLoadedMethod.getDescriptor(MethodDescription.java:1288) at app//net.bytebuddy.asm.Advice$Dispatcher$Inlining$Resolved$AdviceMethodInliner.visitMethod(Advice.java:8400) at app//net.bytebuddy.jar.asm.ClassReader.readMethod(ClassReader.java:1353) at app//net.bytebuddy.jar.asm.ClassReader.accept(ClassReader.java:744) at app//net.bytebuddy.jar.asm.ClassReader.accept(ClassReader.java:424) at app//net.bytebuddy.asm.Advice$Dispatcher$Inlining$Resolved$AdviceMethodInliner.apply(Advice.java:8394) at app//net.bytebuddy.asm.Advice$AdviceVisitor$WithExitAdvice.onUserEnd(Advice.java:10904) at app//net.bytebuddy.asm.Advice$AdviceVisitor.visitMaxs(Advice.java:10683) at app//net.bytebuddy.jar.asm.ClassReader.readCode(ClassReader.java:2665) at app//net.bytebuddy.jar.asm.ClassReader.readMethod(ClassReader.java:1514) at app//net.bytebuddy.jar.asm.ClassReader.accept(ClassReader.java:744) at app//net.bytebuddy.jar.asm.ClassReader.accept(ClassReader.java:424) at app//net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForInlining.create(TypeWriter.java:4014) at app//net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:2224) at app//net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$UsingTypeWriter.make(DynamicType.java:4050) at app//net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:3734) at app//org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.transform(InlineBytecodeGenerator.java:401) at [email protected]/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:244) at [email protected]/sun.instrument.TransformerManager.transform(TransformerManager.java:188) at [email protected]/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:541) at [email protected]/sun.instrument.InstrumentationImpl.retransformClasses0(Native Method) at [email protected]/sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:169) at app//org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.triggerRetransformation(InlineBytecodeGenerator.java:280) at app//org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.mockClass(InlineBytecodeGenerator.java:217) - locked <0x730e33e8> (a org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator) at app//org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator.lambda$mockClass$0(TypeCachingBytecodeGenerator.java:47) at app//org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$$Lambda$895/0x0000000801aeaf98.call(Unknown Source) at app//net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:168) at app//net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:399) at app//net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:190) - locked <0x62f72614> (a java.lang.Object) at app//net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:410)

"ForkJoinPool-1-worker-51" Id=82 BLOCKED on java.lang.Object@62f72614 owned by "ForkJoinPool-1-worker-84" Id=115115 (daemon=TRUE) at app//net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:189) at app//net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:410) at app//org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator.mockClass(TypeCachingBytecodeGenerator.java:40) at app//org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMaker.createMockType(InlineDelegateByteBuddyMockMaker.java:396) at app//org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMaker.doCreateMock(InlineDelegateByteBuddyMockMaker.java:355) at app//org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMaker.createMock(InlineDelegateByteBuddyMockMaker.java:334) at app//org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.createMock(InlineByteBuddyMockMaker.java:56) at app//org.mockito.internal.util.MockUtil.createMock(MockUtil.java:99)

check that

  • The mockito message in the stacktrace have useful information, but it didn't help
  • The problematic code (if that's possible) is copied here;
    Note that some configuration are impossible to mock via Mockito
  • Provide versions (mockito / jdk / os / any other relevant information)
  • Provide a Short, Self Contained, Correct (Compilable), Example of the issue
    (same as any question on stackoverflow.com)
  • Read the contributing guide

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions