Hello List,
A colleague of mine is having an issue with his application deployed in
a Tomcat 5.5.27 (jdk1.5.0_15) on a Debian Linux.
The application makes a connection to service running on a WebLogic
server. Therefor, he needs to include the weblogic.jar library in his
application.
When redeploying the application, he is seeing the following errors in
catalina.out:
INFO: Illegal access: This instance of the web application has already
been stopped. Could not load weblogic.common.T3MiscLogger.
java.lang.IllegalStateException
at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1272)
at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1232)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at
weblogic.time.common.internal.TimeTable.execute(TimeTable.java:227)
at
weblogic.time.common.internal.TimeEventGenerator.run(TimeEventGenerator.java:117)
at java.lang.Thread.run(Thread.java:595)
11-feb-2009 8:43:23 org.apache.catalina.loader.WebappClassLoader
loadClass
INFO: Illegal access: This instance of the web application has already
been stopped. Could not load weblogic.common.T3MiscLogger.
java.lang.IllegalStateException
at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1272)
at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1232)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at
weblogic.time.common.internal.TimeEventGenerator.run(TimeEventGenerator.java:127)
at java.lang.Thread.run(Thread.java:595)
11-feb-2009 8:44:08 org.apache.catalina.loader.WebappClassLoader
loadClass
The only way to solve this is to restart Tomcat.
In order to help him out, I googled for the problem and found a thread
on this mailinglist dated 2007 and responded by Chuck:
http://www.nabble.com/App-reloading-classloading-issue--td12944398.html
Note that the error mentioned in above URL isn't exactly the same, but
it concerns the same library (weblogic.jar), thus I suspect the problem
is either the same or related.
Quoting Chuck's response:
"I suspect that the prior instance of the webapp is actually still
around, or at least its classloader and some undersirably persistent
objects are. When you restart the webapp, another classloader is
created for it, and its references to
weblogic/rmi/extensions/server/Stub are not castable to instances of
the
same class from the first classloader. If you can figure out where the
references to the prior instances are being maintained, perhaps you can
clear them out and allow the older webapp to be completely removed.
(Injudicious use of ThreadLocal is a common cause of this problem.) A
profiler may help to determine objects are still around from the old
copy of the webapp."
I understand what the problem might be, but I don't understand how I
should go about solving this (without having to restart Tomcat) or how
to avoid this from happening. Actually, I'm wondering if someone could
explain the cause of classloaders not being cleaned up when destroying a
webapp.
First of all, I'm not sure how I can figure out where the references to
the prior instances are being maintained, and secondly, I don't know how
to clean them up (both are closely related if you ask me :-) )
My first thought was to take thread dumps, but there aren't showing up
any previous instances of the webapp.
I don't have any experience with profilers, but I can try to use
VisualVM (which has a profiler-like tab) to take a look at all the
objects being instantiated.
Say I find any references to Weblogic, how should I go about having them
removed automatically each time the application is being redeployed?
Thanks.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]