In the RHQ 3.0 server, we use JBossAS 4.2.3's bundled EJB3. A user has reported seeing way too many SLSB instances slowly building up in heap and eventually causing the server to run out of heap (see his post from the rhq-devel list below). Can anyone shed some light on what could be causing it? Is it a bug in the EJB container, a bug in our application code, or just some configuration setting we need to adjust?
Thanks,
Ian
-----
Following up a post from about a month ago. We were seeing a persistent slow memory leak in the rhq server in tenured gen space that eventually led to an out of memory exception after running the server for about a week. I captured a heap dump and found hundreds of thousands of stateless session beans in memory. Here's a snapshot from my profiler of a table of classes with greatest number of instances.
Name | Objects | Shallow Size | Retained Size |
java.util.HashMap$Entry | 1939755 | 93108240 | 189082696 |
java.util.HashMap$Entry[] | 1090957 | 167796768 | 340273520 |
java.util.HashMap | 1084265 | 69392960 | 408521632 |
java.util.LinkedList$Entry | 860965 | 34438600 | 727956072 |
org.jboss.ejb3.BaseSessionContext | 856281 | 34251240 | 34251240 |
org.rhq.enterprise.server.authz.RequiredPermissionsInterceptor | 856281 | 13700496 | 13700496 |
org.rhq.enterprise.server.common.TransactionInterruptInterceptor | 856281 | 13700496 | 13700496 |
org.jboss.ejb3.stateless.StatelessBeanContext | 856265 | 68501200 | 490959040 |
java.lang.String | 429025 | 17161000 | 48902064 |
char[] | 379454 | 37897872 | 37897872 |
java.lang.Integer | 171633 | 4119192 | 4119192 |
java.util.Hashtable$Entry | 157623 | 7565904 | 34980432 |
java.util.TreeMap$Entry | 105496 | 6751744 | 14950816 |
java.lang.String[] | 98401 | 4340480 | 6555536 |
org.rhq.enterprise.server.auth.SubjectManagerBean | 91116 | 6560352 | 49567104 |
org.rhq.enterprise.server.auth.TemporarySessionPasswordGenerator | 91116 | 3644640 | 43006752 |
org.rhq.enterprise.server.authz.AuthorizationManagerBean | 91115 | 2186760 | 2186760 |
org.rhq.enterprise.server.alert.AlertConditionManagerBean | 91084 | 2914688 | 2914688 |
org.rhq.enterprise.server.alert.AlertManagerBean | 90914 | 9455056 | 9455056 |
org.rhq.enterprise.server.alert.AlertDefinitionManagerBean | 90911 | 4363728 | 4363728 |
org.rhq.enterprise.server.alert.AlertConditionLogManagerBean | 90903 | 5090568 | 5090568 |
org.rhq.enterprise.server.alert.CachedConditionManagerBean | 90903 | 4363344 | 4363344 |
org.rhq.enterprise.server.alert.AlertDampeningManagerBean | 90903 | 3636120 | 3636120 |
org.jboss.security.SecurityAssociation$SubjectContext | 49229 | 2362992 | 2362992 |
org.rhq.enterprise.server.cloud.instance.ServerManagerBean | 39354 | 3463152 | 3463152 |
org.rhq.enterprise.server.cloud.CloudManagerBean | 39354 | 2833488 | 2833488 |
Here are the merged paths from the SubjectManagerBean to GCRoot:
<All the objects> |
org.jboss.ejb3.stateless.StatelessBeanContext |
java.util.LinkedList$Entry |
java.util.LinkedList$Entry |
java.util.LinkedList |
org.jboss.ejb3.InfinitePool |
org.jboss.ejb3.ThreadlocalPool |
org.jboss.ejb3.stateless.StatelessContainer |
All the other manager beans have similar merged paths. So I started to wonder why there were so many slsb's in the ThreadlocalPools and after some digging found this (http://community.jboss.org/message/363520) thread that sort of describes what I'm seeing. I still don't know why it's happening but it gave me something to try. I changed the Stateless Bean pool class in ejb3-interceptors-aop.xml from ThreadlocalPool to StrictMaxPool. Now when I run the server and watch it with my profiler I see at max 3 SubjectManagerBeans in memory. Same appears to be true for other slsb's. This isn't a solution to the problem but I'm hoping someone can shed light on what's really going on. I would be happy to upload the heap dump to somewhere public but it's almost a GB in size.
Bala Nair
SeaChange International