【发布时间】:2018-02-07 18:59:51
【问题描述】:
我花了很多时间试图找出导致我的应用程序运行缓慢的原因,也许有人会帮助我检查问题所在。
版本:
spring mvc: 4.2.5.RELEASE
hibernate: 4.3.11.Final
spring-data-jpa: 1.8.2.RELEASE
wildfly: 10
PostgreSQL Server: 9.4
OS: Debian GNU/Linux 7.9 (wheezy)
Server configuration: VPS, 1 proc, 4GB RAM
关于我的应用:
具有静态JSP 登录页面、信息页面和登录的简单Web 应用程序重定向到私人区域。公共页面是静态的,在登录期间首先查询数据库,然后尝试获取登录用户的内容。
有什么问题:
当我浏览配置如下的页面时:
<http auto-config="true">
<intercept-url pattern="/" access="permitAll"/>
<intercept-url pattern="favicon.ico" access="permitAll"/>
<intercept-url pattern="/login/**" access="permitAll"/>
<intercept-url pattern="/info" access="permitAll"/>
...
</http>
没有问题,一切都在他的飞行中加载,没有停顿。它工作顺利。 当我在 /login 上发帖(将我重定向到 /main),然后当我在每个配置如下的站点上导航时:
<intercept-url pattern="/main/**" access="hasRole('ROLE_USER')"/>
<intercept-url pattern="/statistic/**" access="hasRole('ROLE_USER')"/>
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
有时会出现一些极端的延迟,甚至长达 1 分钟。
休眠配置
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- Configure the entity manager factory bean -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="pl.portal.model"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="jpaProperties">
<props>
<!-- <prop key="hibernate.dialect">pl.portal.sql.ProjectPsqlDialect</prop> -->
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.enable_lazy_load_no_trans">true</prop>
<prop key="hibernate.jdbc.use_streams_for_binary">false</prop>
<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF-8</prop>
<prop key="hibernate.connection.characterSet">UTF-8</prop>
</props>
</property>
</bean>
谁能给我一个提示如何确定导致延迟的原因?在我的浏览器中检查 webinspect -> /admin,大小 7,89KB,大小:54 秒(每个 js 或 css 不超过 100 毫秒)
编辑2:
删除了线程转储的无效片段,粘贴了在应用程序上调用操作/admin 后启动的线程的完整转储。线程耗时 61 秒
【问题讨论】:
-
一种廉价的方法来发现它在等待你的一个缓慢响应时执行 Java 线程转储。执行慢速操作的线程可能会显示一个长堆栈跟踪,指向应用程序的慢速部分。
-
另一种相对便宜的方法是使用 VisualVM 和线程采样 (dzone.com/articles/visualvm-12-great-java)。顺便提一句。在linux上做线程转储可以通过
kill -QUIT YOUR_PROCESS_PID或jstack YOUR_PROCESS_PID实现。 -
顺便说一句。如果这是一个新项目,我强烈建议摆脱旧的和泄漏的 DBCP 并使用 HikariCP(或至少切换到 DBCP2)。
-
使用visualVM分析什么是耗时的。
-
您可以使用VisualVM来监控线程状态(所有线程同时)。在线程选项卡中,如果您看到一些红色区域,则表示您的线程已被阻止。一看到你的线程长时间处于阻塞状态就做一个线程转储并分析一下。
标签: performance hibernate spring-mvc optimization wildfly