Have You Seen This Before?
When I got up, I found my blog down. Tomcat 5.5 on OpenJDK 6 crashed five hours earlier. My first thought was that this was OpenJDK 6's fault. Checking /var/log/tomcat55/catalina_2008-08-20.log, I saw:
2008-08-20 00:31:35,987 [TP-Processor15] INFO net.sourceforge.pebble.event.resp onse.SpamScoreListener - Good site rejected : spam score is 3, threshold is 1 # # An unexpected error has been detected by Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x00002ab5d55c3353, pid=22489, tid=1075845456 # # Java VM: OpenJDK 64-Bit Server VM (1.6.0_0-b11 mixed mode linux-amd64) # Problematic frame: # V [libjvm.so+0x472353] # # An error report file with more information is saved as: # /tmp/hs_err_pid22489.log # # If you would like to submit a bug report, please visit: # http://icedtea.classpath.org/bugzilla #
When I tried to restart Tomcat, it errored out with a peculiar exception:
Using CATALINA_BASE: /var/lib/tomcat5.5
Using CATALINA_HOME: /usr/share/tomcat5.5
Using CATALINA_TMPDIR: /var/lib/tomcat5.5/temp
Using JRE_HOME: /usr/lib/jvm/java-6-openjdk
Using Security Manager
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: org.apache.commons.logging.LogConfigurationException: java.lang.NoSuc
hMethodError: java.util.logging.LogManager.getStringProperty(Ljava/lang/String;L
java/lang/String;)Ljava/lang/String; (Caused by java.lang.NoSuchMethodError: jav
a.util.logging.LogManager.getStringProperty(Ljava/lang/String;Ljava/lang/String;
)Ljava/lang/String;)
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactory
Impl.java:538)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactory
Impl.java:235)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactory
Impl.java:209)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)
at org.apache.catalina.startup.Bootstrap.(Bootstrap.java:53)
Caused by: java.lang.NoSuchMethodError: java.util.logging.LogManager.getStringPr
operty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
at java.util.logging.StreamHandler.configure(StreamHandler.java:78)
at java.util.logging.StreamHandler.(StreamHandler.java:94)
at java.util.logging.ConsoleHandler.(ConsoleHandler.java:88)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct
orAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC
onstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at java.lang.Class.newInstance0(Class.java:372)
at java.lang.Class.newInstance(Class.java:325)
at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLo
gManager.java:397)
at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLo
gManager.java:341)
at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLo
gManager.java:236)
at java.util.logging.LogManager$2.run(LogManager.java:277)
at java.security.AccessController.doPrivileged(Native Method)
at java.util.logging.LogManager.readPrimordialConfiguration(LogManager.j
ava:275)
at java.util.logging.LogManager.getLogManager(LogManager.java:258)
at java.util.logging.Logger.(Logger.java:238)
at java.util.logging.LogManager$RootLogger.(LogManager.java:966)
at java.util.logging.LogManager$RootLogger.(LogManager.java:963)
at java.util.logging.LogManager$1.run(LogManager.java:198)
at java.security.AccessController.doPrivileged(Native Method)
at java.util.logging.LogManager.(LogManager.java:175)
at java.util.logging.Logger.getLogger(Logger.java:291)
at org.apache.commons.logging.impl.Jdk14Logger.getLogger(Jdk14Logger.jav
a:152)
at org.apache.commons.logging.impl.Jdk14Logger.(Jdk14Logger.java:5
3)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct
orAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC
onstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactory
Impl.java:529)
... 4 more
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: Could not initial
ize class java.util.logging.LogManager
at java.util.logging.LogManager$Cleaner.run(LogManager.java:221)
Could not find the main class: org.apache.catalina.startup.Bootstrap. Program wi
ll exit.
Tomcat 5.5 is essentially saying that it could not find the method:
class java.util.logging.LogManager {
String getStringProperty(String, String);
}
"This can't be good," I said. When I tried to look at the methods in java.util.logging.LogManager with javap, I was surprised to find the following:
[weiqi@gao] $ javap java.util.logging.LogManager
Compiled from "LogManager.java"
public class java.util.logging.LogManager extends java.lang.Object{
public static final java.lang.String LOGGING_MXBEAN_NAME;
protected java.util.logging.LogManager();
public static java.util.logging.LogManager getLogManager();
public void addPropertyChangeListener(java.beans.PropertyChangeListener)
throws java.lang.SecurityException;
public void removePropertyChangeListener(java.beans.PropertyChangeListener)
throws java.lang.SecurityException;
synchronized java.util.logging.Logger demandLogger(java.lang.String);
public synchronized boolean addLogger(java.util.logging.Logger);
public synchronized java.util.logging.Logger getLogger(java.lang.String);
public synchronized java.util.Enumeration getLoggerNames();
public void readConfiguration() throws java.io.IOException, java.lang.
SecurityException;
public void reset() throws java.lang.SecurityException;
public void readConfiguration(java.io.InputStream) throws java.io.IOEx
ception, java.lang.SecurityException;
public java.lang.String getProperty(java.lang.String);
java.lang.StRing getStringProperty(java.lang.String, java.lang.String);
int getIntProperty(java.lang.String, int);
boolean getBooleanProperty(java.lang.String, boolean);
java.util.logging.Level getLevelProperty(java.lang.String, java.util.logging
.Level);
java.util.logging.Filter getFilterProperty(java.lang.String, java.util.loggi
ng.Filter);
java.util.logging.Formatter getFormatterProperty(java.lang.String, java.util
.logging.Formatter);
public void checkAccess() throws java.lang.SecurityException;
public static synchronized java.util.logging.LoggingMXBean getLoggingMXBean(
);
static java.util.logging.LogManager access$002(java.util.logging.LogManager)
;
static java.util.logging.LogManager access$000();
static java.util.logging.Logger access$102(java.util.logging.LogManager, jav
a.util.logging.Logger);
static java.util.logging.Logger access$100(java.util.logging.LogManager);
static boolean access$302(java.util.logging.LogManager, boolean);
static boolean access$402(java.util.logging.LogManager, boolean);
static java.lang.String[] access$600(java.util.logging.LogManager, java.lang
.String);
static void access$700(java.util.logging.Logger, java.util.logging.Logger);
static java.util.logging.Level access$800();
static void access$900(java.util.logging.LogManager);
static {};
}
No wonder Tomcat 5.5 can't find the method! The methods return type was all messed up. Time for a reboot. When I reboot, Debian threw up some message on the console which essentially said "can't do it, pal, you need to press the reset button."
After pressing the reset button, Tomcat 5.5 start up OK.
The point of this post? There are no points. I just feel that this is peculiar. It's one of those situations where a reboot "fixed" the problem. Something is wrong in this box. But I don't know what it is. I'll just have to wait until the problem recurs in the future.
If you have dealt with such problems before, I would be glad to hear your opinions.
JavaFX Desktop SDK By End Of 2008, Without...
... the On2 video codecs for live video streams?
(Via James Weaver.)
Danny Coward: Looking ahead a little, the plan here is to release the final version of the SDK for the desktop at the end of this year and a preview of the mobile version next March or so. I say or so, not just because schedules are schedules, but because we are ready to adjust based on the feedback we get from this preview release.
Release schedules are indeed slippery things. When I read "by the end of this year", I went, "that's not what they said last time?" But what did they say last time, "fall of 2008"? I couldn't find the link! Preserving the link is one of the purposes of this blog.
Another purpose of this blog is to point out something obvious from the quoted interview:
Param Singh, Sun senior director of Java marketing: JavaFX isn't exactly complete yet. Some features, like the On2 video codecs for live video streams, won't be available until next year.
With a little logic, it is not hard to deduce that the "final version of the SDK for the desktop" won't contain "the On2 video codecs for live video streams".
Sigh!