我正在使用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
答案 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?