JSP完成执行后会发生什么?

时间:2009-03-19 08:17:21

标签: java jsp memory garbage-collection

当JSP完成执行时,是否会将JSP页面中声明的所有变量用于垃圾回收?如果我在JSP中声明了一些内存密集型Hashtables,并且我让JSP完成执行而不预先将变量设置为null,那么即使在JSP执行完毕后该对象是否会保留在内存中?

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

此示例批处理脚本在输出目录中为 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生命周期。