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

Mar*_*eit 4 java performance wicket eclipselink

我正在使用apache wicket框架和Eclipselink与PostgreSQL开发一个Java Web应用程序进行OR映射.

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

任何想法如何找到问题?

编辑:

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

jbr*_*ver 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());
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

确保你拆卸你的模型:

public class MyPage extends WebPage {

    IModel<HeavyDataObject> heavyModel;

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

}
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助!

  • 为延迟道歉.`Application.newSessionStore()`是您可以使用自定义版本的地方.`PropertyModel`和`CompoundPropertyModel`通常指向一些(通常是重的)对象.如果所述对象存储为`Page`或`Component`中的类级变量,那么这将是一个大问题. (2认同)