对象重用与GC
有时候我们为了提高系统的性能,避免重复耗时的操作,希望能够重用某些创建完成的对象。既然是重用(reuse)现有对象,就会涉及对象保存的问题,通常我们把用来缓存对象的容器对象称为对象池(ObjectPool)。通过对象池技术,我们可以大大地提高应用的性能,减少内存需求,例如,我们经常用到的JDBC连接池与EJB实例池等技术,都属于对象池技术的范畴。
通过使用对象池的办法来提高系统性能,节约系统内存开销是一个非常简易、高效的方法,对象池通过对其所保存对象的共享与重用,缩减了应用线程反复重建、装载对象的过程所需要的时间,并且也有效地避免了频繁垃圾回收带来的巨大系统开销。
正是考虑到对象池存在的巨大意义以及能够为应用带来卓越的性能优势,下面我们给出对象池的代码框架,以帮助你理解,对象池是如何避免系统频繁的垃圾回收所带来的巨大系统开销的。下面是一个对象池的抽象类,也是应用对象池的基类:
public abstract class ObjectPool
{
private Hashtable locked, unlocked;
private long expirationTime;
abstract Object create();
abstract void expire( Object o );
abstract void validate( Object o );
synchronized Object getObject(){...}
synchronized void freeObject( Object o ){...}
}
在这个类中声明了5个重要方法:对象创建方法create()、对象过期方法expire()、获取对象方法getObject()、对象有效性验证方法 validate()与对象释放方法freeObject()。我们可以通过create()方法创建新的对象实例,并且将这个对象实例保存到哈希表(Hashtable)对象中,当其他应用请求对象实例时,可以通过调用getObject()方法获取哈希表中的对象,并检测其有效性是否过期,如果一切正常则将该对象传递给调用者,调用者使用完对象实例后可以通过调用方法freeObject()将该对象实例释放(归还)给对象池。
既然对象实例被保存,当应用试图重用该对象时就不需要重新创建新的对象,避免大量垃圾对象的产生。即使你所使用的对象的生命周期较短,可以被系统及时回收,也会引发JVM频繁GC的危机,导致系统性能下降。
但是如果长时间地将对象保存在对象池中,也就是驻留在内存中,而这些对象又不被经常地使用,无疑也会造成不必要的内存资源浪费,或者该对象在对象池中遭到破坏,如果不能将该对象及时清除而继续占用系统的内存资源,也是非常麻烦的事情。因此在应用对象池技术重用对象时,应该考虑其必要性并权衡利弊做出最优的选择,如果决定使用对象池技术,需要采取相应的手段清除遭到破坏的对象,甚至在某些情况下需要清除对象池中所有的对象。或者你可以为对象池中的每个对象分配一个时间戳,设定对象的过期时间,当对象过期后及时在内存中将其清除。下面以JDBC连接池为例,说明如何通过对象池技术重用对象中的技术要点,帮助你理解怎样才能更好地提高系统性能,降低系统内存的开销。
在上面的对象池类中,我们声明了一个对象创建方法abstract Object create() throws Exception。在JDBC连接池中也需要创建一个该抽象方法的实现方法Object create() throws SQLException,这个方法抛出了SQLException,在这个方法中通过对方法Driver- Manger.getConnection()的调用获取一个JDBC数据库连接对象,例如下面的代码:
Object create() throws SQLException
{
return( DriverManager.getConnection(dsurl, usr, pwd ) );
}
综上所述,使用对象池是有诸多好处的,但是我们一定要恰当地使用这项技术,否则反受其累。
如果对象池中的对象过多,或者没有做必要的清除处理,没有考虑应用所运行环境的内存资源的限制等,都会使系统导致灾难性的错误。因此当你决定采用这种技术时应当依据上面我们讲解的知识,考虑周全。正如上面所说的,其他对象池的技术与连接池的技术都是类似的
分享到:
相关推荐
在Java编程中,对象的创建、使用和销毁是由垃圾收集器自动管理的。理解这一过程对于优化应用程序性能至关重要,因为不恰当的对象管理可能导致内存泄漏,增加垃圾收集器的工作负担,进而影响整体程序运行效率。 在...
- 内存管理:Java采用自动垃圾回收机制(Garbage Collection, GC)来管理内存,开发者无需手动释放内存。 6. **文档注释(Javadoc)**: Java提供了特殊格式的注释,用于生成API文档,有助于其他开发者理解和使用...
堆内存是垃圾回收器管理的主要区域,因此也称为GC堆。 2. **方法区(Method Area)**:用于存放已被加载类的信息、常量、静态变量等数据。它与堆一样,在程序启动时创建,并且是线程共享的。Java 8之后的方法区被...
* MinorGC:在新生代中进行垃圾回收,过程包括复制、清空和互换等步骤。 * MajorGC:在老年代中进行垃圾回收,释放长期对象。 本资源整理了JAVA面试中经常涉及的知识点,涵盖JVM、线程、Java内存区域、垃圾回收机制...
3. 垃圾:在程序中无法访问的内存块,这些内存需要被回收以便重用。 二、垃圾收集的工作原理 1. 引用计数法:每个对象有一个引用计数,当引用减少到0时视为垃圾。但这种方法无法处理循环引用问题。 2. 根可达算法:...
通过对JVM_GC调优的深入探讨,我们可以看出JVM内存管理和垃圾回收机制的复杂性。合理的GC策略和参数调整对于提高Java应用的性能至关重要。理解不同GC算法的特点和适用场景,可以帮助开发者选择最适合特定应用场景的...
Java程序员可以使用System.gc()方法来提示垃圾回收机制,但是垃圾回收机制并不是由操作系统自动执行的。 12. Java中的异常处理: Java中的异常处理可以用来处理程序中的错误和异常。Java提供了try-catch语句和...
在Java中,垃圾回收器(Garbage Collector,简称GC)负责识别不再使用的对象并释放其占用的内存,以防止内存泄漏。Java的垃圾回收主要有标记-清除、复制、分代等策略,主要GC的触发条件包括分配栈顶指针到达一定阈值...
Java是一种面向对象的编程语言,它以对象为核心,将数据和操作数据的方法封装在一起,形成了一个模块化的单元。面向对象编程(OOP)与面向过程编程不同,后者按照解决问题的步骤顺序设计程序,而OOP则是通过模拟现实...
Java中的垃圾回收机制自动管理内存,释放不再使用的对象所占用的内存空间。程序员不能直接控制垃圾回收过程,但可以通过System.gc()建议JVM进行垃圾回收。 Java中的字符串(String)是一个不可变的字符序列。Java...
理解如何合理分配内存,以及何时会发生对象引用和垃圾回收,是解决性能问题的关键。 异常处理是Java程序中不可或缺的一部分。Java使用try-catch-finally语句块来捕获和处理运行时错误。熟悉各种内置异常类型以及...
Java 的垃圾回收机制(GC): 1. 垃圾回收机制可以自动跟踪内存使用情况,当对象长时间无人使用时,自动进行垃圾回收。 2. 优点:改善内存泄漏缺点,效率低。 3. 缺点:不能完全避免内存泄漏,仍是国际难题。 Java...
11. **垃圾回收(Garbage Collection)**:Java自动管理内存,通过垃圾回收机制回收不再使用的对象,防止内存泄漏。开发者可以使用System.gc()建议进行垃圾回收,但通常不推荐。 12. **网络编程**:Java提供Socket...
7. **JVM内存模型**:了解堆、栈、方法区、本地方法栈等区域的分配和垃圾回收机制,有助于优化性能和排查内存问题。 8. **Spring框架**:Spring是Java企业级应用的事实标准,提供了依赖注入、AOP(面向切面编程)、...
- **垃圾回收(GC)**:理解垃圾回收的工作原理,以及如何避免内存泄漏。 - **堆和栈内存**:理解对象在内存中的分配。 10. **设计模式** - **常见设计模式**:单例模式、工厂模式、装饰器模式、观察者模式等,...
- Java的垃圾回收机制自动管理内存,释放不再使用的对象所占用的内存空间,减轻了程序员的负担,并提高了程序的可靠性。 #### Java虚拟机(JVM) JVM(Java Virtual Machine)是一个虚拟执行环境,负责解释执行...
9. **利用对象池**:对于频繁创建和销毁的对象,可以使用对象池技术,通过重用已存在的对象来避免频繁的内存分配和回收,从而提高系统性能。 总的来说,Java中的内存管理并非完全自动化,程序员仍需关注对象生命...
10. **垃圾回收(GC)**:Java的自动内存管理机制,负责回收不再使用的对象所占用的内存,避免内存泄露。 11. **反射**:反射机制允许程序在运行时动态获取类的信息并操作类的对象,增加了程序的灵活性和动态性。 12...
源代码可以让你理解对象生命周期和垃圾回收的工作原理。 10. **设计模式**:《Thinking in Java》中还介绍了多种设计模式,如工厂模式、单例模式、装饰器模式等。源代码展示了如何在实际项目中应用这些模式。 通过...
- 垃圾回收(Garbage Collection, GC):Java自动管理内存,当对象不再使用时,垃圾回收器会自动回收内存,避免内存泄漏。 7. **Java与C++的区别**: - Java没有预处理指令,如#include,而是使用import导入类...