如果运行一天,Java Web应用程序会变慢

时间:2011-07-27 12:31:16

标签: java performance wicket eclipselink

我正在使用apache wicket框架和Eclipselink与PostgreSQL开发一个用于OR映射的java Web应用程序。

如果我运行应用程序(在localhost或远程服务器上),一切都快速可用。目前只有五个用户。大约一天后,应用程序的某些部分开始变慢。特别是使用数据库中的数据的页面和使用来自OWL文件的数据的自动完成功能。静态页面加载速度非常快。

任何想法如何找到问题?

修改

感谢您的回复。问题似乎是会话生成的内存使用情况。这就解释了为什么我不能只用一个用户在我的本地机器上重现这个问题。对我来说,快速解决方法是在启动Tomcat时增加堆大小(-Xmx和-Xms)。现在我将深入研究wicket页面并找到耗费内存的模型。

5 个答案:

答案 0 :(得分:7)

Wicket要求围绕序列化页面的“重量”进行一些非常可靠的编码实践。序列化页面存储在Session中,如果您无法分离任何类级别模型,数据也会被序列化。在我意识到这一点之前,我看到会话大小接近几百MB,因为我正在序列化一半的数据库查询!

所以,有些事情可能会有所帮助:

如果会话太大,请覆盖会话存储以警告您。

 public class CustomSessionStore extends SecondLevelCacheSessionStore {

    @Override
    public void setAttribute(Request request, String name, Object value) {
        super.setAttribute(request, name, value);

        if (Session.get().getSizeInBytes() > SESSION_WARN_LIMIT) {
            log.warn("Session Size is {} bytes", Session.get().getSizeInBytes());
        }
    }
 }

确保分离模型:

public class MyPage extends WebPage {

    IModel<HeavyDataObject> heavyModel;

    @Override
    public void onDetach() {
        if (heavyModel != null)
            heavyModel.detach();
    }

}

使用wicket开发人员工具在应用程序运行时监视各种数据大小/存储。 maven依赖关系是org.apache.wicket wicket-devutils

希望有所帮助!

答案 1 :(得分:1)

jVisualVM是你的朋友。

如果您使用eclipse开发应用程序,请尝试考虑Memory Analysis Tool插件和一个很好的教程here

  • 首先检查应用程序的内存使用情况
  • 然后考虑请求发送时间......

这些可以很容易地找到瓶颈。

答案 2 :(得分:1)

我过去曾使用Yourkit,这是分析应用程序的有用工具。

答案 3 :(得分:0)

好吧,拥有像dynaTrace这样的工具有助于简化操作,因为它可以更直接地向您显示应用程序中存在性能问题的层。

但是,为了代替没有这个,我会查看系统上的内存和CPU使用情况,看看它是否/何时出现峰值。查看内存使用情况。看看你是否可以看到垃圾收集器正在做什么以及它运行后释放了多少。也许你有一个内存泄漏,通过一些模糊的“链接”留在堆上的对象使它们保持活力。 (另外看一下Collections和ArrayLists以及常规数组,什么不是。那些通常可能是泄漏的来源。你创建了太多的字符串并且做了大量的“+”连接而不是使用StringBuffer吗?

此外,您的应用程序的某些部分是否很慢?还是整件事?也许你需要更多内存才能更好地运行?也许您需要检查数据库以查看它是否建议索引或更有效的查询等。

另一种想法......我并不是说这种方式很糟糕......你是否已经将应用程序加载到系统或其他系统上,然后再将其放入“生产”或问题所在的位置?

只需要寻找一些想法。只记得一次调整一件事,看看是否有所作为。一次调整太多东西并不能帮助你知道究竟是什么解决了这个问题。

但老实说......我会研究像dynaTrace或其他工具(我知道dynaTrace因为我们在公司使用它)。如果没有其他任何东西,它会在尝试排除故障时为您提供更好的指导。

哦,如果您使用HttpSession存储大量变量,请注意。如果你这样做,你可以快速耗尽内存。

答案 4 :(得分:0)

这听起来像是对我的记忆。听起来你的机器,特别是JVM,正在交换。没有什么比JVM交换更糟糕了。

今天25MB的可用内存“没什么”,尤其是1GB。

我说这个的原因仅仅是因为有5个用户,它们不太可能是你问题的原因。你可能正在做大量的网络流量,存储东西是真正糟糕的数据结构,并对从你的5个用户的流量累积的数据执行一些O(n ^ 2)算法。

这一切都是可能的。这真的不太可能。

由于你机器上的资源紧张,以及Java和其他东西今天对内存的贪婪欲望,我更倾向于我们知道的东西,指出机器需要更多内存。