【发布时间】:2026-02-19 17:50:01
【问题描述】:
我从另一个团队获得了我正在使用的代码,并且我花了几天时间试图在我的应用程序中追踪可疑的内存泄漏。几次重新部署后,我收到 OutOfMemory 错误。我使用了几种工具来追踪泄漏,包括 YourKit Java Profiler 和 IBM 的 Support Assisant Memory Analyzer。我的应用程序是一个 Spring 3.0.5 J2EE 应用程序,使用 spring-mvc 注释驱动的控制器在 WebSphere 6.1 上运行。
我所做的大部分研究都指向一个我觉得非常可疑的类,我们称之为 MyFactory,它看起来像这样:
import org.springframework.context.ApplicationContextAware;
public final class MyFactory implements ApplicationContextAware {
//this should be changed to be non static after getInstance is removed
private static ApplicationContext applicationContext;
public MyFactory() {
//empty
}
public static SettingObjectFactory getInstance() {
return (MyFactory) applicationContext.getBean("MyFactory");
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
MyFactory.applicationContext = applicationContext;
}
}
我忽略了这个类中的一大堆其他逻辑,它们基本上是从数据库中读取数据并将其存储在内存中(靠近缓存)。但是,在重新部署应用程序后,此类似乎会挂在 ApplicationContext 上。
这个类的类加载器是挂在 ApplicationContext 上还是阻止它被完全清理?我知道我们不再需要 getInstance 方法,而且我认为不需要让此类具有静态 ApplicationContext - 在我看来 Spring 应该强制此类的单例。
【问题讨论】:
标签: java spring memory-leaks websphere