【发布时间】:2010-10-14 06:27:04
【问题描述】:
当一个 JSP 执行完毕后,所有在 JSP 页面中声明的变量都会被放到垃圾回收器中吗?如果我在 JSP 中声明了一些内存密集型 Hashtable,并且我让 JSP 完成执行而不事先将变量设置为 null,那么即使在 JSP 执行完成之后,对象还会留在内存中吗?
(我没有将它们存储在持久变量中,例如会话。只是在局部变量中。)
【问题讨论】:
标签: java jsp memory garbage-collection
当一个 JSP 执行完毕后,所有在 JSP 页面中声明的变量都会被放到垃圾回收器中吗?如果我在 JSP 中声明了一些内存密集型 Hashtable,并且我让 JSP 完成执行而不事先将变量设置为 null,那么即使在 JSP 执行完成之后,对象还会留在内存中吗?
(我没有将它们存储在持久变量中,例如会话。只是在局部变量中。)
【问题讨论】:
标签: java jsp memory garbage-collection
如果变量在请求或页面范围内声明,是的,它们有资格进行垃圾回收。
即使将对象引用设置为 null,它仍然在消耗内存,只是引用计数减 1。如果引用计数为 0,垃圾收集器将释放内存。
【讨论】:
好吧,一旦执行完成,JSP 引擎就会从内存中删除 JSP 页面(如果范围未设置为会话)。但是,为避免内存泄漏,您应该使用 jspDestroy() 方法来释放内存。
【讨论】:
如果您想确切了解 JSP 翻译成的 Java 逻辑代码,可以使用Jasper 生成代码。 (不同的 JSP 引擎可能会产生不同的输出,但变量的范围等应符合规范。)您需要 Tomcat 和 Ant。
此示例批处理脚本为 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 生命周期。
【讨论】: