【JAVA优化编程】内存管理之——(6)对象重用与GC
6? 对象重用与GC
??? 有时候我们为了提高系统的性能,避免重复耗时的操作,希望能够重用某些创建完成的对象,但是既然是重用(reuse)就涉及对象保存的问题,通常将用来缓存对象的应用称为对象池(ObjectPool),通过这个途径我们可以大大地提高应用的速度,减少内存需求,例如,我们经常提到的JDBC连接池与EJB实例池等概念都属于对象池的范畴。
??? 通过使用对象池的办法来提高系统性能,节约系统内存开销是一个非常简易、高效的方法,对象池通过对其所保存对象的共享与重用,缩减了应用线程反复重建、装载对象的过程所需要的时间,并且也有效地避免了频繁垃圾回收带来的巨大系统开销。
??? 下面我们给出对象池的代码框架,以帮助你理解对象池是怎样避免系统频繁的垃圾回收所带来的巨大系统开销的。下面是一个对象池的抽象类,也是应用对象池的基类:
synchronized void cleanUp() { Connection conn; long currentTime = System.currentTimeMillis(); Enumeration enumeration = unlocked.keys(); while (enumeration.hasMoreElements()) { conn = enumeration.nextElement(); if ( (currentTime - ((long) unlocked.get(conn) ).longValue() ) > expirationTime ) { unlocked.remove( conn ); expire( conn ); conn = null; // 请注意这一行代码的作用 } } System.gc();}??
??? 在这个方法中的最后一行代码强制系统做垃圾回收,这是因为我们已经将连接池中被清除的对象做了空值的赋值操作,也就是释放了对该对象的引用,使其对虚拟机来说变得不可达,转化为系统垃圾,然后回收之,释放其占用的内存,结合上面的知识很容易理解这一点。
??? 综上所述,使用对象池是有诸多好处的,但是我们一定要恰当地使用这项技术,否则反受其累。
??? 如果对象池中的对象过多,或者没有做必要的清除处理,没有考虑应用所运行环境的内存资源的限制等,都会使系统导致灾难性的错误。因此当你决定采用这种技术时应当依据上面我们讲解的知识,考虑周全。正如上面所说的,其他对象池的技术与连接池的技术都是类似的,因此我们讲解本节的目的就是想起到抛砖引玉的作用,使你在处理这方面的应用时不至于在内存管理方面出现可避免的疏漏。