Reproducer for a JBR bug where -XX:+AllowEnhancedClassRedefinition causes a
JVM crash (SIGSEGV) when Mockito/ByteBuddy retransforms a class whose bytecode
was previously modified by a ClassFileTransformer using javassist.
The crash occurs in VM_EnhancedRedefineClasses::find_class_bytes() →
JvmtiClassFileReconstituter::write_method_infos().
This reproduces what happens when HotswapAgent's Vaadin plugin transforms
VaadinServlet's constructor via javassist, and then Mockito creates a mock
of VaadinServlet using ByteBuddy's inline mock maker.
- JetBrains Runtime (JBR) with
-XX:+AllowEnhancedClassRedefinitionsupport - Maven 3.x
Build:
mvn package -DskipTestsTest 1 — baseline (no agent, should pass):
java -XX:+EnableDynamicAgentLoading \
-cp "target/jbr-crash-reproducer-1.0-SNAPSHOT.jar:target/lib/*" \
test.NestAccessTestTest 2 — agent without the flag (should pass):
java -XX:+EnableDynamicAgentLoading \
-javaagent:target/jbr-crash-reproducer-1.0-SNAPSHOT.jar \
-cp "target/jbr-crash-reproducer-1.0-SNAPSHOT.jar:target/lib/*" \
test.NestAccessTestTest 3 — agent with the flag (crashes on affected JBR versions):
java -XX:+EnableDynamicAgentLoading \
-XX:+AllowEnhancedClassRedefinition \
-javaagent:target/jbr-crash-reproducer-1.0-SNAPSHOT.jar \
-cp "target/jbr-crash-reproducer-1.0-SNAPSHOT.jar:target/lib/*" \
test.NestAccessTest| Test | Configuration | Result |
|---|---|---|
| 1 | No agent | OK |
| 2 | Agent, no -XX:+AllowEnhancedClassRedefinition |
OK |
| 3 | Agent + -XX:+AllowEnhancedClassRedefinition |
SIGSEGV crash |
- A java agent (
agent.NoOpAgent) uses javassist to transformBaseServlet's constructor, injecting a call toPluginClass.onServletInit(this) PluginClass.onServletInit()referencesPluginClass.Command, a package-private inner classMockito.mock(BaseServlet.class)triggers ByteBuddy's inline mock maker, which callsInstrumentation.retransformClasses(BaseServlet.class)- With
-XX:+AllowEnhancedClassRedefinitionenabled, the JVM entersVM_EnhancedRedefineClasses::find_class_bytes()and crashes inJvmtiClassFileReconstituter::write_method_infos()with a SIGSEGV
V [libjvm.so] JvmtiClassFileReconstituter::write_method_infos()
V [libjvm.so] JvmtiClassFileReconstituter::write_class_file_format()
V [libjvm.so] VM_EnhancedRedefineClasses::find_class_bytes()
V [libjvm.so] VM_EnhancedRedefineClasses::load_new_class_versions()
V [libjvm.so] VM_EnhancedRedefineClasses::doit()
V [libjvm.so] VM_Operation::evaluate()
V [libjvm.so] VMThread::evaluate_operation()
- JBR-25.0.1+8-268.52-nomod (OpenJDK 25, aarch64)