所以基础是我有Glassfish 2.1和Java 1.6.0_15它会工作几天但它会占用所有内存,似乎无论最大内存设置多高。它是一个32位的jvm,最大内存现在为4GB,它可以快速使用它,然后与垃圾收集器一起使用,从而使吞吐量达到爬行状态。所以经过几次尝试后,我得到了一个3GB的堆转储并用YourKit打开它。
此服务器上的用法是执行一些RMI调用和一些REST https调用的swing客户端,以及调用大量REST https服务的php网站。
它显示:
Name Objects Shallow Size Retained Size
java.lang.Class 22,422 1,435,872 1,680,800,240
java.lang.ref.Finalizer 3,086,366 197,527,424 1,628,846,552
com.sun.net.sll.internal.ssl.SSLSessionImpl 3,082,887 443,935,728 1,430,892,816
byte[] 7,901,167 666,548,672 666,548,672
......等等。哎,记忆在哪里?哦,300万个SSLSessionImpl实例,就是这样。
似乎所有的https调用都会导致这些SSLSessionImpl对象累积,但是它们永远不会被GC控制。在YourKit中查看它们,终结器是GC根。在网络上进行搜索,看起来非常像http://forums.sun.com/thread.jspa?threadID=5266266和http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=80df6098575e8599df9ba5c9edc1?bug_id=6386530
我下一步去哪儿?我如何深入了解这一点?
答案 0 :(得分:2)
现在,通过升级到最新的JVM,这似乎已得到修复。 1.6.0_18修正了与此相关的bug 4918870。在升级JVM之前,我有几个堆转储,其中包含100,000-4,000,000个SSLSessionImpl,现在通常少于5000个实例。