出问题的代码:return new ModelAndView("redirect:" + targetUrl); 其中targetUrl是需要转向的目标URL,可能包含动态的参数。
springMVC在处理上述代码时,会认为这种redirect:XXX是一个View定义,会在其beanfactory中尝试寻找对应的 bean定义,在寻找过程中,会向其beanfactory内部的一个alreadyCreated Map变量中缓存本次寻找结果(key是viewName,value是布尔值true)。在存在巨量的重定向时,这个alreadyCreated就会引起内存泄漏。在spring的buglist中可以找到相同情况的说明:https://jira.springsource.org/browse/SPR-10065
spring提供了解决该问题的方案,但是,是通过一些个人觉得比较晦涩的用法,很容易会误用。(https://jira.springsource.org/browse/SPR-10065有说明),因此建议最好的方法是:在重定向中尽可能的避免使用spring提供的redirect:view视图。而使用标准的JEE API:
String encodedRedirectURL = response.encodeRedirectURL(targetUrl);
response.sendRedirect(encodedRedirectURL);
并且,该问题在测试过程中很容易会被忽略,因为每次向alreadyCreated Map中只增加一个URL字符串,每次泄漏的内存很微小,因此在压测过程中容易被忽略,但是长期积累就会引起问题。