开发Java Web应用程序的最有效方法是什么?或者更具体,说Wicket应用程序?

时间:2011-04-22 06:46:19

标签: java performance jvm hotswap hotdeploy

这是我第一次在这里发帖提问,我会尽量让我的问题清楚。

我尝试找到开发Java webapps的最佳流程。经过数月的反复试验,我的Web开发环境由以下部分组成:

框架:Apache Wicket 1.4.16
IDE:eclipse Galileo,m2eclipse插件
构建工具:Maven 2
数据访问:EclipseLink 2.1.1通过JPA 2.0(使用StaticWeave)
RDBMS:使用jTDS的MSSQL 2005或更高版本 DI:Google Guice 2.0
开发Web容器:嵌入Maven Jetty插件的Jetty服务器 目标Web容器:Tomcat 6.x或更高版本

我使用maven Jetty插件测试运行我的webapps,启用JPDA,同时需要行精度跟踪。

每当对源代码进行更改时,我都必须重新加载我的应用才能生效。按ENTER重新加载是好的,但经过几次重新加载(大约3~5取决于我的PermGen设置),抛出OutOfMemoryException,而不是我必须关闭并再次启动我的应用程序。我知道自动重新加载可以通过配置来实现,但它只会导致OOME更快(由于过多的重新加载)。

谷歌搜索后,我意识到存在一些内存泄漏问题。我已经尝试放大MaxPermSize设置,但我的装备上的RAM是有限的,设置为非常大的东西是不合理的。 BTW,内存泄漏检测是在Tomcat 7中引入的,我发现大多数内存泄漏来自jTDS,Google Guice和Wicket本身,但我无能为力。

我能做些什么来加速我的开发过程?为了减少重新加载时间,我应该转移到更高级的Web容器,例如Glassfish(抱歉,我在这里买不起WebLogic或WebSphere。)或任何东西。

提前致谢,欢迎提出任何意见!

2 个答案:

答案 0 :(得分:5)

我使用JRebel,它确实有很大帮助。我仍然需要立即重启服务器,但大多数更改都可以正常工作。它非常适合以Wicket为中心的以Java为中心的框架。你也可以尝试DCEVM,如果你有一个'黑客'版本的JDK用于开发。

答案 1 :(得分:0)

我有一个简单的Jetty包装器,用于在eclipse中启动webapp。如果我在调试模式下启动它,那么除非我更改方法签名或字段名称,否则不需要重新加载。不需要重新加载上下文。

    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.webapp.WebAppContext;

    public static void main(String[] args) {
       Properties properties= ...//read properties from text file
       Server server = new Server(properties.getPort());
       WebAppContext webapp = new WebAppContext(
              properties.getWebApplicationPath(), properties.getContextPath());
    server.start();
       //.... and here can be key capture for stopping Jetty

    }

其中properties.getWebApplicationPath()是./WebContent(或者根据您的maven项目结构可能会有所不同)。

在Tomcat中部署时,这不会解决内存泄漏问题,但在开发过程中可能非常有用。 我也在使用Wicket和Guice,我没有注意到内存泄漏。