This is a customer escalation 1-11839641, case # 64729037.
This is likely a bug in the hotspot optimisation. The testcase generates repeated
NULL pointer exceptions on purpose. It is observed that the size of the exception message grows ~2x the size of the previous exception. JVM eventually run out of memory resulting in an OOM.
Interesting but true.
Here are test results from different configurations on the Weblogic's JVM:
JVM version options problem reproducible
--------------------------------------------------------------------------
1.3.1_16 -server yes
1.3.1_16 -server, -XX:-OmitStackTraceInFastThrow no
1.3.1_16 -client no
1.3.1_16 -Xint no
1.4.2_09 -server yes
1.4.2_09 -server, -XX:-OmitStackTraceInFastThrow no
1.4.2_09 -client no
1.4.2_09 -Xint no
A known workaround for the customer is to go with 1.3.1_16 with -XX:-OmitStackTraceInFastThrow, given a slight performance penalty.
(Note Weblogic 7.0 SP4 does not support 1.4.2)
The original files for the testcase is in
/net/cores.central/cores/64729037/CONFIGURATION,
note the OOMTest2 is modified to use a single bean instead of N bean which N
is specified in the command line.
Original Weblogic logs which track the exception message sizes and GC output is in
/net/cores.central/cores/64729037/LOGS
Here are steps to reproduce the problem:
1. logon to khalsi.red.iplanet.com
% setenv TESTHOME /home/lc3092
2. % cd $TESTHOME/bea/weblogic700/server/bin
% sh startWLS.sh (as root)
Note you can change JAVA_HOME, JAVA_VM, or JAVA_OPTIONS settings inside
this script
3. wait for weblogic to start up, you will see something about server started
in RUNNING mode:
<Sep 21, 2005 3:22:46 PM PDT> <Notice> <WebLogicServer> <000360> <Server started in RUNNING mode>
4. % cd $TESTHOME/client
% setenv CLASSPATH .:$TESTHOME/bea/weblogic700/server/lib/weblogic.jar
% java OOMTest2 10 khalsi.red.iplanet.com
Here is the output observed from weblogic server:
(note the increasing exception message's length)
<...lots of stuff deleted...>
ejbCreate called
------- Server side ex.msg.len = 122, ex.class=class
java.lang.NullPointerException
setSessionContext called
ejbCreate called
------- Server side ex.msg.len = 369, ex.class=class
java.lang.NullPointerException
setSessionContext called
ejbCreate called
------- Server side ex.msg.len = 863, ex.class=class
java.lang.NullPointerException
setSessionContext called
ejbCreate called
------- Server side ex.msg.len = 1851, ex.class=class
java.lang.NullPointerException
setSessionContext called
ejbCreate called
------- Server side ex.msg.len = 3827, ex.class=class
java.lang.NullPointerException
setSessionContext called
ejbCreate called
------- Server side ex.msg.len = 7779, ex.class=class
java.lang.NullPointerException
setSessionContext called
ejbCreate called
------- Server side ex.msg.len = 15683, ex.class=class
java.lang.NullPointerException
setSessionContext called
ejbCreate called
------- Server side ex.msg.len = 31491, ex.class=class
java.lang.NullPointerException
Here's output from client:
<...lots of stuff deleted...>
java.lang.NullPointerException:
Start server side stack trace:
java.lang.NullPointerException
<<no stack trace available>>
End server side stack trace
<<no stack trace available>>
End server side stack trace
<<no stack trace available>>
End server side stack trace
<<no stack trace available>>
End server side stack trace
<<no stack trace available>>
End server side stack trace
<<no stack trace available>>
End server side stack trace
<<no stack trace available>>
End server side stack trace
<<no stack trace available>>
End server side stack trace
<<no stack trace available>>
End server side stack trace
<<no stack trace available>>
<<----------------
------- Main ex.msg.len = 157933, ex.class=class java.rmi.RemoteException
I created a tarball of the web server with the deployed EJB as
an alternative way to reproduce:
1. untar /net/cores.central/cores/64729037/testcase.tar into $TESTHOME
2. % cd $TESTHOME/bea/weblogic700/server/bin
% sh startWLS.sh
Note you can change JAVA_HOME, JAVA_VM, or JAVA_OPTIONS settings inside
this script
3. wait for weblogic to start up, you will see something about server started
in RUNNING mode:
<Sep 21, 2005 3:22:46 PM PDT> <Notice> <WebLogicServer> <000360> <Server started in RUNNING mode>
4. % cd $TESTHOME/client
% setenv CLASSPATH .:$TESTHOME/bea/weblogic700/server/lib/weblogic.jar
% java OOMTest2 10 <server>
where server name is the server where you start weblogic,
for eg. you logged on to titan.sfbay.sun.com and run startWLS.sh
then run java OOMTest2 10 titan.sfbay.sun.com