-
Bug
-
Resolution: Unresolved
-
P3
-
8u281
-
Cause Known
-
x86_64
-
windows_7
ADDITIONAL SYSTEM INFORMATION :
OS: Windows 7
Classes compiled with the Microsoft Compiler (jvc, jdk 1.0).
JRE: 8u261 (works), 8u281 (doesn't work).
A DESCRIPTION OF THE PROBLEM :
It would appear there has been some regression in how anonymous inner classes compiled using older JDK's are loaded in 8u281. Previously, using 8u261, this error would not appear. The following stacktrace is given when using 8u281:
java.lang.ClassFormatError: Illegal field name "1" in class postilion/core/tranmgr/PerfMonManager$1
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
The class in question (PerfMonManager) has a static initialization block that adds a runtime shutdown hook, where the thread defining the shutdown hook is constructed as an anonymous inner class, ie.
Runtime.getRuntime().addShutdownHook(
new Thread("TranMgr PerfMonManager Cleanup")
{
public void run()
{
PerfMonManager.close();
}
});
This anonymous class is compiled into PerfMonManager$1.class
This is a legacy application that is compiled using the Microsoft Compiler (jvc). My best guess is that the byte-code from these anonymous inner classes, generated using an old JDK, can no longer be understood by the latest JRE. There is no mention in the release notes of anything that would have changed the way classes are loaded.
Unfortunately, this is not the only case where anonymous inner classes are used in our code, and it is not feasible to update the application to not build against the Microsoft Compiler without substantial changes.
Turning off the verifier (-Xverify:none) allows the application to start, but the consequences of this is unknown and definitely not something we can consider doing.
REGRESSION : Last worked in version 8
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Define an anonymous inner class inside a main class, compiled using JVC, and attempt to execute the program using the latest 8u281.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The class should be loaded/executed successfully as in 8u261.
ACTUAL -
java.lang.ClassFormatError: Illegal field name "1" in class is thrown.
FREQUENCY : always
OS: Windows 7
Classes compiled with the Microsoft Compiler (jvc, jdk 1.0).
JRE: 8u261 (works), 8u281 (doesn't work).
A DESCRIPTION OF THE PROBLEM :
It would appear there has been some regression in how anonymous inner classes compiled using older JDK's are loaded in 8u281. Previously, using 8u261, this error would not appear. The following stacktrace is given when using 8u281:
java.lang.ClassFormatError: Illegal field name "1" in class postilion/core/tranmgr/PerfMonManager$1
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
The class in question (PerfMonManager) has a static initialization block that adds a runtime shutdown hook, where the thread defining the shutdown hook is constructed as an anonymous inner class, ie.
Runtime.getRuntime().addShutdownHook(
new Thread("TranMgr PerfMonManager Cleanup")
{
public void run()
{
PerfMonManager.close();
}
});
This anonymous class is compiled into PerfMonManager$1.class
This is a legacy application that is compiled using the Microsoft Compiler (jvc). My best guess is that the byte-code from these anonymous inner classes, generated using an old JDK, can no longer be understood by the latest JRE. There is no mention in the release notes of anything that would have changed the way classes are loaded.
Unfortunately, this is not the only case where anonymous inner classes are used in our code, and it is not feasible to update the application to not build against the Microsoft Compiler without substantial changes.
Turning off the verifier (-Xverify:none) allows the application to start, but the consequences of this is unknown and definitely not something we can consider doing.
REGRESSION : Last worked in version 8
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Define an anonymous inner class inside a main class, compiled using JVC, and attempt to execute the program using the latest 8u281.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The class should be loaded/executed successfully as in 8u261.
ACTUAL -
java.lang.ClassFormatError: Illegal field name "1" in class is thrown.
FREQUENCY : always
- relates to
-
JDK-8148854 Class names "SomeClass" and "LSomeClass;" treated by JVM as an equivalent
- Resolved