简体   繁体   中英

How to find classloader leak with free tools?

I'm investigating a memory leak in a Tomcat/Spring/Hibernate app which is causing the dreaded "out of permgen" error after a few redployments. I've downloaded the free version of plumbr, which confirms that I have a classloader leak, but unfortunately I can't afford the $499 to get the detailed report. Is there a free tool that can perform an equivalent analysis and tell me where to look for it? Or some other common cause of such leaks that I can investigate?

Steps I've taken so far:

  • Ensure my JDBC driver is unregistered at context shutdown
  • Manually shut down the MySQL driver's AbandonedConnectionCleanupThread (per Tomcat Guice/JDBC Memory Leak )

What else might be causing the leak?

You can use the evaluation version of JProfiler to investigate the class loader leak. Go to the class loader probe, select one of the leaking class loaders and show them in the heap walker where you can investigate strong references to the classes that were loaded by the class loader.

There is a screen cast that shows you how to do this.

Disclaimer: My company develops JProfiler.

I found that Eclipse's Memory Analysis Tools worked reasonably well. I set my server to produce a heap dump and used MAT (roughly following the guide here ) to find all the classloaders. It seems the relevant one is org.apache.catalina.loader.WebappClassLoader , and by listing their GC roots I was easily able to find out that my problem was being caused by java.util.logging.Level which was indirectly referenced through an org.jboss.logging.JDKLevel .

Now I just need to figure out how to prevent JBoss Logging doing this...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM