Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

constantPoolClass in Java heap?

Tags:

java

memory

I have inherited a Java applet (an actual <APPLET>) which throws an OutOfMemory exception after about 4 days of runtime. The nature of the applet is such that people really will leave it open for long periods of time.

After almost two days running, jmap -histo shows the top heap consumers as:

    num  #instances   #bytes  class name
    ---  ----------   ------  ----------
      1:      14277  7321880  <constantPoolKlass>
      2:      59626  5699968  <constMethodKlass>
      3:      14047  5479424  <constantPoolCacheKlass>
      4:      14277  5229744  <instanceKlassKlass>
      5:      59626  4778944  <methodKlass>
      6:      71026  3147624  <symbolKlass>

The trouble is, I don't understand what any of these things are. There are at least two things going on: constantPoolKlass+constantPoolCacheKlass+instanceKlassKlass appear related, as do constMethodKlass+methodKlass. From the names, they appear related to a class loader.

If I had to guess I'd say the applet has creating about 14,277 objects where each object has about 4 methods, for about 59626 methods total. Yet the jmap output doesn't show any class with such a large number of instances, nor does it look like the sum total of other class objects add up to 14277. So maybe I'm incorrect about what these objects do. Can someone explain?

like image 844
DGentry Avatar asked Dec 04 '08 15:12

DGentry


2 Answers

Yup, looks like you are leaking class loaders. If you're not actually creating class loaders in you own code (typically through URLClassLoader.newInstance or XSLT) then it may be related to reloading the applet (although you would usually get back the same class loader). Possible causes of leaks are ThreadLocal, JDBC drivers and java.beans.

like image 182
Tom Hawtin - tackline Avatar answered Oct 05 '22 23:10

Tom Hawtin - tackline


Spot on - obviously a ClassLoader issue. Very strange to see that in an applet though; normally it's only a problem with appservers or IDEs.

2 ways to debug this: either get a real heap profiler that can show you where your runaway class data is referenced, or patch the API classes as described here: http://www.onjava.com/pub/a/onjava/2004/06/30/classloader2.html?page=2

like image 40
Michael Borgwardt Avatar answered Oct 06 '22 01:10

Michael Borgwardt