2

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

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

框架:Apache Wicket 1.4.16
IDE:eclipse Galileo,带有 m2eclipse 插件
构建工具:Maven 2
数据访问:EclipseLink 2.1.1 via JPA 2.0(带有 StaticWeave)
RDBMS:MSSQL 2005 或更高版本,带有 jTDS
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 是有限的,将其设置为非常大的东西是不合理的。顺便说一句,Tomcat 7 中引入了内存泄漏检测,我发现大多数内存泄漏来自 jTDS、Google Guice 和 Wicket 本身,但我对此无能为力。

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

在此先感谢,欢迎任何意见!

4

2 回答 2

5

我使用JRebel,它真的很有帮助。我仍然需要不时重新启动服务器,但大多数更改都可以正常工作。它非常适合像 Wicket 这样的以 Java 为中心的框架。如果您可以使用 JDK 的“破解”版本进行开发,您也可以尝试DCEVM 。

于 2011-04-24T19:13:57.690 回答
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,但我没有注意到内存泄漏。

于 2011-04-23T15:45:40.500 回答