有一个项目使用了spring mvc,以前因为各种原因一两个月内都会重启一次,但是最近两个月因为项目没有新的业务发布,所以工程就一直没有被重启,突然有一天应用挂起了,无法访问,cpu也被吃满,查看full gc记录发现项目的full gc越来越频繁,觉得可能是某个地方出现了内存泄露,于是用jmap把jvm的内存dump出来,发现一个叫viewCache的对象占用了好几个G的内存,是spring框架中的一个对象,于是查看源码。
spring的试图解析器抽象类中,解析返回对象时,会以controller的返回值为key把解析视图对象放到HashMap结构的缓存中。
org.springframework.web.servlet.view.AbstractCachingViewResolver
public View resolveViewName(String viewName, Locale locale) throws Exception {
if (!isCache()) {
logger.warn("View caching is SWITCHED OFF -- DEVELOPMENT SETTING ONLY: This can severely impair performance");
return createView(viewName, locale);
}
else {
Object cacheKey = getCacheKey(viewName, locale);
synchronized (this.viewCache) {
View view = (View) this.viewCache.get(cacheKey);
if (view == null) {
// Ask the subclass to create the View object.
view = createView(viewName, locale);
this.viewCache.put(cacheKey, view);
if (logger.isDebugEnabled()) {
logger.debug("Cached view [" + cacheKey + "]");
}
}
return view;
}
}
}
我们的controller中有一些地方会出现:
@RequestMapping(value = "/home")
public String home(HttpServletRequest request) {
if (xxxx) {
// rds为随机数
return "redirect:/user/login?" + rds;
}
return "home";
}
这样当系统在不断的运行过程中,viewCache中不重复的key会越来越多,因为没有设置一个reload的阀值,最终导致内存泄露。
分享到:
相关推荐
### Spring MVC 重定向导致内存溢出解决方案 在Spring MVC框架中进行页面重定向操作时,可能会遇到因重定向导致的内存溢出问题。本文将详细介绍该问题的原因、原理以及解决方法。 #### 一、问题背景及原因分析 在...
在本文中,我们将深入探讨如何利用Spring MVC实现在Web应用中进行文件的上传与下载。 首先,我们需要理解Spring MVC中的两个核心组件:Model、View和Controller。Controller接收用户请求,处理业务逻辑,然后将结果...
3. `IntrospectorCleanupListener`防止内存泄漏,清理Spring自动发现的JavaBeans属性信息。 然后,`DispatcherServlet`是Spring MVC的核心,它负责处理所有请求,并根据`spring-mvc.xml`配置文件进行调度。`load-on...
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
当请求结束时,Spring会清理`ThreadLocal`中的`RequestAttributes`,防止内存泄漏。 具体到Spring MVC的生命周期,`HttpServletRequest`的设置发生在`FrameworkServlet`的`service()`方法中,这个方法会被Servlet...
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
2. **Spring MVC**:在Spring 5.3.17中,Spring MVC持续优化了Web应用的开发体验。它提供了模型-视图-控制器的架构模式,使得开发者可以更轻松地处理HTTP请求和响应,支持RESTful风格的接口,增强了对WebSocket的...
在Spring MVC框架中,处理大文件的下载是一个常见的需求,特别是在大数据或文件服务的应用场景下。传统的文件下载方式可能会导致内存溢出,因为整个文件会被一次性加载到内存中。为了解决这个问题,Spring MVC提供了...
6. **清理资源**:在请求处理完成后,`processRequest` 方法还会清除之前设置的一些线程局部变量,如 Locale 上下文和 Request 属性等,以避免内存泄漏。 7. **日志记录**:最后,如果启用了调试日志,那么会记录...
springmvc的资源配置:Spring 刷新Introspector防止内存泄露,Spring MVC配置;Character Encoding filter; <param-name>contextConfigLocation <param-value>classpath*:applicationContext-*.xml ...
在Spring MVC框架中,文件上传和下载是常见的功能需求,特别是在Web应用中处理用户的数据交互。Spring MVC提供了灵活且强大的支持来实现这些操作。本文将详细介绍如何使用Spring MVC 3的注解方式来实现文件上传与...
1. 文件大小限制:Spring MVC允许设置最大上传文件大小,防止内存溢出。 2. 文件类型检查:确保用户上传的是安全的文件类型,避免恶意文件。 3. 临时存储:上传的文件通常先存储在临时目录,之后再移动到持久化存储...
5. **XML处理漏洞**:Spring Framework可能使用了易受攻击的XML库,如存在XXE(XML External Entity)漏洞,攻击者可以通过恶意构造的XML文档来泄露系统信息或执行恶意操作。 除了安全修复,4.3.16版本可能还包含了...
- 关闭资源:完成操作后,记得关闭Statement、Connection等资源,防止内存泄漏。 **5. 日志记录** 为了便于调试和追踪程序运行状态,项目中可能使用了如Log4j或java.util.logging等日志框架。这些框架可以帮助我们...
《Spring MVC、Shiro与Redis集群的整合应用详解》 在现代Web开发中,安全管理和数据缓存是两个至关重要的环节。Apache Shiro是一个强大且易用的Java安全框架,负责处理认证、授权、会话管理和加密等任务。Redis则是...
- **性能调优**:合理设置缓存策略,优化数据访问,减少内存泄漏。 - **安全考虑**:使用Spring Security增强应用安全性,防止XSS、CSRF等攻击。 总之,Spring Framework 4.0.x不仅在功能上进行了增强,更在性能...
- 谨慎设计bean的生命周期,避免内存泄漏或不必要的资源消耗。 整合Spring和Struts2可以使项目受益于两者的优点,提高开发效率,增强应用的可维护性和可扩展性。然而,随着Spring Boot和Spring MVC的流行,现代...
- **内存管理**:及时清理上传的临时文件,避免内存泄漏。 以上就是Spring MVC中文件上传和下载的关键知识点,通过这些知识可以有效地实现在Web应用中处理文件上传和下载的需求。在实际开发中,还应注意性能优化和...