manage 类和 dao 类由 spring 来管理, spring 什么时候释放这些类的实例对象的内存空间吗?

我的项目采用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 类的实例对象吗?

谢谢!

阅读 3.4k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题