<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body link="#355491" alink="#4262a1" vlink="#355491" style="background: #e2e2e2; margin: 0; padding: 20px;">

<div>
        <table cellpadding="0" bgcolor="#FFFFFF" border="0" cellspacing="0" style="border: 1px solid #dadada; margin-bottom: 30px; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                <tbody>
                        <tr>

                                <td>

                                        <table border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" style="border: solid 2px #ccc; background: #dadada; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                                                <tbody>
                                                        <tr>
                                                                <td bgcolor="#000000" valign="middle" height="58px" style="border-bottom: 1px solid #ccc; padding: 20px; -moz-border-radius-topleft: 3px; -moz-border-radius-topright: 3px; -webkit-border-top-right-radius: 5px; -webkit-border-top-left-radius: 5px;">
                                                                        <h1 style="color: #333333; font: bold 22px Arial, Helvetica, sans-serif; margin: 0; display: block !important;">
                                                                        <!-- To have a header image/logo replace the name below with your img tag -->
                                                                        <!-- Email clients will render the images when the message is read so any image -->
                                                                        <!-- must be made available on a public server, so that all recipients can load the image. -->
                                                                        <a href="https://community.jboss.org/index.jspa" style="text-decoration: none; color: #E1E1E1">JBoss Community</a></h1>
                                                                </td>

                                                        </tr>
                                                        <tr>
                                                                <td bgcolor="#FFFFFF" style="font: normal 12px Arial, Helvetica, sans-serif; color:#333333; padding: 20px;  -moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 5px; -webkit-border-bottom-left-radius: 5px;"><h3 style="margin: 10px 0 5px; font-size: 17px; font-weight: normal;">
    ClassLoader bottleneck in 5.1.0.GA
</h3>
<span style="margin-bottom: 10px;">
    created by <a href="https://community.jboss.org/people/stylpe">Mikal Henriksen</a> in <i>Performance Tuning</i> - <a href="https://community.jboss.org/message/831673#831673">View the full discussion</a>
</span>
<hr style="margin: 20px 0; border: none; background-color: #dadada; height: 1px;">

<div class="jive-rendered-content"><p>So it looks like our app is affected by JBCL-185 and/or JBCL-100. We were running visualvm during load testing, and discovered that EJB proxy instances had a very high self-time. This is a SLSB with a @Local interface, so it should be pretty fast.</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>We did a thread dump, and it turns out most of the servlet threads were blocked waiting for a class loader. Some examples:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>Several are like this: </p><p><span style="font-size: 10pt;">Thread: ajp-0.0.0.0-8009-11 : priority:5, demon:true, threadId:198, threadState:BLOCKED</span></p><p>- waiting on &lt;0x22d22fe3&gt; (a org.jboss.web.tomcat.service.WebCtxLoader$ENCLoader)</p><p>java.lang.ClassLoader.loadClass(ClassLoader.java:291)</p><p>java.lang.ClassLoader.loadClass(ClassLoader.java:295)</p><p>- locked &lt;0x2c25bf62&gt; (a org.jboss.ejb3.common.classloader.PrimitiveAwareClassLoader)</p><p>java.lang.ClassLoader.loadClass(ClassLoader.java:247)</p><p>org.jboss.ejb3.common.lang.SerializableMethod.getClassFromName(SerializableMethod.java:307)</p><p>org.jboss.ejb3.common.lang.SerializableMethod.getClassType(SerializableMethod.java:282)</p><p>org.jboss.ejb3.common.lang.SerializableMethod.toMethod(SerializableMethod.java:233)</p><p>org.jboss.ejb3.common.lang.SerializableMethod.toMethod(SerializableMethod.java:220)</p><p>org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.handleInvocationDirectly(SessionProxyInvocationHandlerBase.java:240)</p><p>org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:182)</p><p>org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:164)</p><p>$Proxy815.getAdaptedItem(Unknown Source)</p><p>[servlet method here]</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>The thread owning 0x22d22fe3:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>Thread: ajp-0.0.0.0-8009-18 : priority:5, demon:true, threadId:205, threadState:BLOCKED</p><p>- waiting on &lt;0x1b4ddacc&gt; (a org.jboss.classloader.spi.base.BaseClassLoader)</p><p>java.lang.Class.forName0(Native Method)</p><p>java.lang.Class.forName(Class.java:247)</p><p>org.jboss.classloader.plugins.loader.ClassLoaderToLoaderAdapter.loadClass(ClassLoaderToLoaderAdapter.java:172)</p><p>org.jboss.classloader.spi.ClassLoaderDomain.loadClassFromParent(ClassLoaderDomain.java:352)</p><p>org.jboss.classloader.spi.ClassLoaderDomain.loadClassAfter(ClassLoaderDomain.java:323)</p><p>org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:275)</p><p>org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:1119)</p><p>org.jboss.classloader.spi.base.BaseClassLoader.loadClassFromDomain(BaseClassLoader.java:798)</p><p>org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:441)</p><p>- locked &lt;0x357d9553&gt; (a org.jboss.classloader.spi.base.BaseClassLoader)</p><p>java.lang.ClassLoader.loadClass(ClassLoader.java:295)</p><p>- locked &lt;0x22d22fe3&gt; (a org.jboss.web.tomcat.service.WebCtxLoader$ENCLoader)</p><p>java.lang.ClassLoader.loadClass(ClassLoader.java:295)</p><p>- locked &lt;0x7866dc25&gt; (a org.jboss.ejb3.common.classloader.PrimitiveAwareClassLoader)</p><p>java.lang.ClassLoader.loadClass(ClassLoader.java:247)</p><p>org.jboss.ejb3.common.lang.SerializableMethod.getClassFromName(SerializableMethod.java:307)</p><p>org.jboss.ejb3.common.lang.SerializableMethod.toMethod(SerializableMethod.java:239)</p><p>org.jboss.ejb3.common.lang.SerializableMethod.toMethod(SerializableMethod.java:220)</p><p>org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:182)</p><p>org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:164)</p><p>$Proxy815.getAdaptedItem(Unknown Source)</p><p>[servlet method here]</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>The thread owning 0x1b4ddacc:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>Thread: ajp-0.0.0.0-8009-5 : priority:5, demon:true, threadId:192, threadState:RUNNABLE</p><p>java.util.Arrays.copyOfRange(Arrays.java:3209)</p><p>java.lang.String.(String.java:215)</p><p>java.lang.StringBuilder.toString(StringBuilder.java:430)</p><p>org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:448)</p><p>- locked &lt;0x1b4ddacc&gt; (a org.jboss.classloader.spi.base.BaseClassLoader)</p><p>java.lang.ClassLoader.loadClass(ClassLoader.java:295)</p><p>- locked &lt;0x24c3e995&gt; (a org.jboss.ejb3.common.classloader.PrimitiveAwareClassLoader)</p><p>java.lang.ClassLoader.loadClass(ClassLoader.java:247)</p><p>org.jboss.ejb3.common.lang.SerializableMethod.getClassFromName(SerializableMethod.java:307)</p><p>org.jboss.ejb3.common.lang.SerializableMethod.toMethod(SerializableMethod.java:239)</p><p>org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:135)</p><p>org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:216)</p><p>org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:207)</p><p>org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:164)</p><p>$Proxy815.getAdaptedItem(Unknown Source)</p><p>[servlet method here]</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>According to what I've read on the issue pages and in discussions here, the root cause is the classes aren't properly cached, and thus have to be loaded on every single session bean invocation.</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>Is there a way to work around this issue? Upgrading JBoss is not an option, but if upgrading only the class loader component is possible, we could do that. </p></div>

<div style="background-color: #f4f4f4; padding: 10px; margin-top: 20px;">
    <p style="margin: 0;">Reply to this message by <a href="https://community.jboss.org/message/831673#831673">going to Community</a></p>
        <p style="margin: 0;">Start a new discussion in Performance Tuning at <a href="https://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2078">Community</a></p>
</div></td>
                        </tr>
                    </tbody>
                </table>


                </td>
            </tr>
        </tbody>
    </table>

</div>

</body>
</html>