我的项目采用spring + struts2 + hibernate 架构,启动起来后,发现程序执行越来越慢,
于是采用 jprofiler 来监控,发现每个 manage 类和 dao 类的实例对象越来越多,我始终搞不明白
为什么 manage 类和 dao 类的实例会越来越多,按照自己的理解,这些类都交由 spring 来管理
spring在自动装配的时候,应该都是使用同一个实例对象来装配,怎么会产生这么多的实例对象呢?
通过测试,发现有这样的规律:
1 客户端请求的次数越多,这些类的实例对象就越多,但不是每次请求就产生一个新的实例对象
2 客户端的本次请求,即使没有用到这个 manage 类或者 dao 类, 该manage 类(dao 类) 也会产生新的实例对象
换句话说,客户端的每次请求,都有可能使不相关的 manage 类和 dao 类生成新的实例对象
3 spring是在 客户端发起请求的时候,才开始进行自动装配
举例: manage类如下:
@Component("discountFeeManage")
public class FinancialOffice_discountFeeManageImpl {
private FinancialOffice_discountFeeDao listDao;
@Resource(name="discountFeeDao")
public void setListDao( FinancialOffice_discountFeeDao listDao ) {
super.setDao( listDao ); // @1
this.listDao = listDao;
}
}
dao 类如下:
@Component("discountFeeDao")
public class FinancialOffice_discountFeeDaoImpl {
}
每次客户端发起请求的时候, @1 处的代码都会执行,因此可以判断, spring是在客户端发起请求后
才开始进行装配
由上面 3 个现象,自己做出如下猜测:
1 spring在每次请求时自动根据某一规则来生成 bean 的实例并自动装配,请求过后应该释放资源,但是它没有这么做,
或者说,释放资源的条件不足,因此没有释放资源。
2 项目中的 manage 类和 dao 类交由 spring 来管理, 但是 action 类并没有交给 spring 来管理, 虽然在 action 类的代码中
也是使用 @Resource 注解来对 manage 类实现自动装配,但是, spring 很可能会因为不同的request请求需要对同一个 manage类
(dao 类)实例化多个对象,这样做,很可能的原因是,不同的请求不能共享同一个实例对象.
我的问题是:
1 manage类和 dao 类交由 spring 来管理, sprig 使用过后,什么时候这些类的实例化对象的内存空间才被释放,才可以被垃圾回收器回收?
2 spring内部,不同的请求真的不能共享同一个 manage 类的实例对象吗?
谢谢!