0

我有基于tomcat的servlet。Servlet 有基于注解类的 mvc,看起来像(伪代码)

@RequestMapping("/myAction")
public String getAction(Model m) {
     DBConnection conn = new DBConnection();//connect to DB
     Result r = conn.getDataOfAction();//run some sql query and return result
     ArrayList<POJO> list = r.getResult();//24 instances of class, for example
     m.put("list",list); //It's for resolving pojo into JSP page
     String result = CustomViewResolver.getString(viewName, list);//i just point to ViewName and get parsed jsp page
     //list.clear();
     return result;
}

当我按原样开始使用评论//list.clear()进行分析时。POJO即使页面已经在客户端呈现后,我也会遇到所有情况都留在内存中的情况。当我//list.clear()在所有POJO垃圾收集时取消注释时,除了指向 forEachjstl标记的垃圾。

在此处输入图像描述

我冲洗并关闭了所有东西Stream'sWriter's但似乎无关紧要。这是正常的方式清除列表,还是我做错了什么?谢谢。

UPD:我尝试其他情况,当我使用jstl

    <c:forEach items=${POJOLIST} var="pojo"></c:forEach>

pojo's留在记忆里。${POJOLIST}但是,如果我在jsp不使用的情况下打印jstl,那么当所有 pojo 垃圾按照我想要的方式收集时。jstlvar重新创建对象并将其保存在内存中?

4

3 回答 3

0

如果您使用@SessionAttribute 或手动管理会话,“对象命令”将保留在会话中。因此,一旦你完成了控制器,你需要告诉控制器你的动作已经完成并且 Sessions 变量不再有用并且可以被清理了:

@RequestMapping("/myAction")
public String getAction(Model m, SessionStatus status) {
     ....
     m.put("list",list); 
     status.setComplete(); //tells the controller you're done with your actions and will clean all sessions variables
     return view;
}
于 2013-01-25T16:09:52.877 回答
0

这是我在分析我的应用程序时遇到的问题。原来是因为 enablePooling在 web.xml jsp servlet 中默认开启,对象不会像你期望的那样被释放。唯一的解决方案是关闭 enablePooling。看看这两个提出的错误

https://issues.apache.org/bugzilla/show_bug.cgi?id=25623

https://issues.apache.org/bugzilla/show_bug.cgi?id=16001

于 2013-10-22T20:08:07.543 回答
0

我最近遇到了同样的问题。我已经用谷歌搜索了很长时间来解决这个问题。最后我通过设置enablePoolingfalsein解决了它$TOMCAT_HOME/conf/web.xml。(参数的默认值为 true。)

<init-param>
    <param-name>enablePooling</param-name>
    <param-value>false</param-value>
</init-param>
于 2016-11-03T06:55:01.810 回答