Pieter Temmerman wrote:

> 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 :-) )

You are on the right track with a profiler. I use (and highly recommend)
YourKit. I get a free copy as an Apache developer for investigating Tomcat
related issues but it is reasonably priced and I have bought several copies for
different projects over the years. It usually returns the investment on the
first issue I fix.

As to the why - image a scenario such as this.

Tomcat starts
Tomcat (for some reason) loads a JDBC driver
The JDBC driver is registered with the driver manager
Note: Tomcat has to load the DriverManager to do this
Your webapp starts
Your web app loads a JDBC driver
Your web app registered the JDBC driver with the driver manager
Your web app stops
You have a huge memory leak.

Why?
Remembering that every class keeps a reference to the classloader that loaded 
it:
DriverManager was loaded by Tomcat
DriverManager has a reference to your JDBC driver
Your JDBC driver has a reference to the web application classloader
The web application class loader retains references to every class it has loaded

Hence none of your classes are unloaded and Tomcat has an instance of your web
application it can't garbage collect -> memory leak.

Repeat this a few times and you'll get an OOM.

As well as JDBC drivers, logging frameworks are frequent culprits for causing 
this.

> 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?

You need to find which objects are holding on to a reference to the the weblogic
class and make sure it gets cleared when the app restarts. A context listener
might be useful here.

In the example above, you would need to remove the reference to your JDBC driver
from the DriverManager.

Profilers should provide utilities to trace references to instances of classes.

HTH,

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to