【问题标题】:What happens when a JSP finishes execution?当 JSP 完成执行时会发生什么?
【发布时间】:2010-10-14 06:27:04
【问题描述】:

当一个 JSP 执行完毕后,所有在 JSP 页面中声明的变量都会被放到垃圾回收器中吗?如果我在 JSP 中声明了一些内存密集型 Hashtable,并且我让 JSP 完成执行而不事先将变量设置为 null,那么即使在 JSP 执行完成之后,对象还会留在内存中吗?

(我没有将它们存储在持久变量中,例如会话。只是在局部变量中。)

【问题讨论】:

    标签: java jsp memory garbage-collection


    【解决方案1】:

    如果变量在请求或页面范围内声明,是的,它们有资格进行垃圾回收。

    即使将对象引用设置为 null,它仍然在消耗内存,只是引用计数减 1。如果引用计数为 0,垃圾收集器将释放内存。

    【讨论】:

    • Java 不使用 refcounting GC。
    【解决方案2】:

    好吧,一旦执行完成,JSP 引擎就会从内存中删除 JSP 页面(如果范围未设置为会话)。但是,为避免内存泄漏,您应该使用 jspDestroy() 方法来释放内存。

    【讨论】:

      【解决方案3】:

      如果您想确切了解 JSP 翻译成的 Java 逻辑代码,可以使用Jasper 生成代码。 (不同的 JSP 引擎可能会产生不同的输出,但变量的范围等应符合规范。)您需要 TomcatAnt

      此示例批处理脚本为 output 目录中的 test.jsp 生成 Java 代码:

      @ECHO OFF
      SETLOCAL EnableDelayedExpansion
      SET ANT_HOME=C:\dev\apache-ant-1.7.1
      SET TOMCAT_HOME=C:\Program Files\Apache Software Foundation\Tomcat 6.0
      SET CLASSPATH="
      FOR /r "%TOMCAT_HOME%\bin\" %%a IN (*.jar) DO SET CLASSPATH=!CLASSPATH!;%%a
      FOR /r "%TOMCAT_HOME%\lib\" %%a IN (*.jar) DO SET CLASSPATH=!CLASSPATH!;%%a
      SET CLASSPATH=!CLASSPATH!;%ANT_HOME%\lib\ant.jar"
      MKDIR output
      java org.apache.jasper.JspC -d .\output -webapp .\WebContent test.jsp
      

      WebContent 是 Web 应用程序的根目录。生成的代码是一个 servlet,将遵循规范中定义的 servlet 生命周期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-06
        • 2015-01-29
        • 1970-01-01
        • 1970-01-01
        • 2012-11-22
        • 2013-04-18
        • 2018-10-21
        • 2018-05-03
        相关资源
        最近更新 更多