Итак, в основном у меня Glassfish 2.1 и Java 1.6.0_15, и он будет работать в течение нескольких дней, но он съедает всю память, которую он может, по-видимому, независимо от того, насколько велика максимальная память. Это 32-битная jvm с максимальным объемом памяти в 4 ГБ, и он быстро использует все это, а затем сбрасывает с помощью сборщика мусора, повышая пропускную способность для сканирования. Поэтому после нескольких попыток я получил дамп кучи 3 ГБ и открыл его с помощью YourKit.
На этом сервере используется клиент Swing, который выполняет несколько вызовов RMI и некоторые вызовы REST https, а также веб-сайт php, вызывающий множество служб REST https.
Показывает:
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
... и так далее. Ну и дела, куда делась память? О, 3 миллиона экземпляров 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
Куда мне идти дальше? Как мне докопаться до этого?