计算加载的类

时间:2010-09-30 22:02:34

标签: java classloader

我正在使用sun jdk1.6.0_21运行apache tomcat 6.0.29的web服务,webservice使用spring,hibernate,axis 1.4,apache cxf,jaxb和其他一些库。

我用javamelody监视tomcat实例,我可以识别加载类的不断增长,加载类的数量在在线时间内仍在增长。

那么有没有办法找到生成哪些类,垃圾收集器不应该进行清理。

这些是我的JAVA_OPTS

-Xmx768m -Xms512m -Xss4m  -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=128m -XX:PermSize=128m

2 个答案:

答案 0 :(得分:1)

您是在谈论加载还是加载实例

几乎100k课程很多。 JRE 1.6的整个RT有大约17k类,包括内部类。 100k实例并不是那么多。

此外,不卸载类(不包括旨在实现此目的的框架,如OSGi模块)。但是,实例会在必要时进行垃圾回收。

如果你没有OutOfMemory异常(你有足够的空间),垃圾收集器不需要那么具有攻击性。具有较少内存的启动tomcat,您将看到gc将开始更积极地收集。我不建议在生产中这样做,因为通过对GC施加压力来降低性能。

此外,像YourKit这样的工具可以告诉你很多内存中的对象,包括我相信有多少人有资格获得gc。这并不意味着gc必须收集它们,但它可能会收集它们。

答案 1 :(得分:0)

只有在类加载器被垃圾回收后才能卸载类。您可能希望执行堆转储并找出引用类加载器的内容。

有关如何分析堆转储,请参阅:General strategy to resolve Java memory leak?