Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Lock в класслоадере очень надолго (15 сек)!


Автор: Barvetal 3.6.2008, 15:57
Всем привет!

Решили произвести нагрузочное тестирование нашего сайта. Страницы начали не отдаваться по 10-30 секунд... Посмотрел, что происходит в дампе потоков. Происходит следующее:
Один из потоков берет лок (на момент дампа потоков этот поток обрабатывал клиентский запрос 16 секунд):
java.lang.Thread.State: RUNNABLE
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    - locked <0x74d489a8> (a sun.misc.Launcher$ExtClassLoader)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
    - locked <0x74d48960> (a sun.misc.Launcher$AppClassLoader)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
    - locked <0x74d48960> (a sun.misc.Launcher$AppClassLoader)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1274)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1205)
    at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:95)
    at org.hibernate.impl.SessionFactoryImpl.getImplementors(SessionFactoryImpl.java:683)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1543)
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
    at net.myorg.persistence.dao.GenericDao.loadByFieldsEqOrLike(GenericDao.java:187)
    at net.myorg.persistence.dao.GenericDao.loadByFields(GenericDao.java:159)
    at net.myorg.persistence.dao.GenericDao.loadByField(GenericDao.java:138)
    at net.myorg.persistence.utils.UrlUtils.getDocListUrl(UrlUtils.java:96)
    at net.myorg.persistence.utils.UrlUtils.getDocListUrl(UrlUtils.java:103)
    at net.myorg.portal.calendar.Renderer.getWeeks(Renderer.java:265)
    at net.myorg.portal.calendar.View.pageBeginRender(View.java:137)
    at org.apache.tapestry.AbstractPage.firePageBeginRender(AbstractPage.java:478)
    at org.apache.tapestry.AbstractPage.renderPage(AbstractPage.java:268)
    at org.apache.tapestry.engine.RequestCycle.renderPage(RequestCycle.java:366)
    at org.apache.tapestry.portlet.PortletRendererImpl.renderPage(PortletRendererImpl.java:76) 
             .......
этого лока ждут другие 74 потока:
                java.lang.Thread.State: BLOCKED (on object monitor)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:269)
    - waiting to lock <0x74d48960> (a sun.misc.Launcher$AppClassLoader)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1274)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1205)
    at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:95)
    at org.hibernate.impl.SessionFactoryImpl.getImplementors(SessionFactoryImpl.java:683)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1543)
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
    at net.myorg.persistence.dao.GenericDao.loadByFieldsEqOrLike(GenericDao.java:187)
    at net.myorg.persistence.dao.GenericDao.loadByFields(GenericDao.java:159)
    at net.myorg.persistence.dao.GenericDao.loadByField(GenericDao.java:138)
    at net.myorg.persistence.utils.UrlUtils.getDocListUrl(UrlUtils.java:96)
    at net.myorg.persistence.utils.UrlUtils.getDocListUrl(UrlUtils.java:103)
    at net.myorg.portal.calendar.Renderer.getWeeks(Renderer.java:265)
    at net.myorg.portal.calendar.View.pageBeginRender(View.java:137)
    at org.apache.tapestry.AbstractPage.firePageBeginRender(AbstractPage.java:478)
    at org.apache.tapestry.AbstractPage.renderPage(AbstractPage.java:268)
    at org.apache.tapestry.engine.RequestCycle.renderPage(RequestCycle.java:366)
    at org.apache.tapestry.portlet.PortletRendererImpl.renderPage(PortletRendererImpl.java:76) 
             .......
Самомум старому потоку из них - 81 секунда!

Почему первый поток выполняет так долго java.lang.ClassLoader.loadClass? Как устранить проблему?

Заранее большое спасибо!

Автор: alexadr 3.6.2008, 18:41
Возможно поможет загрузка класслоадером определенных классов(тех что долго грузятся java.lang.ClassLoader.loadClass) на стадии инициализации приложения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)