在创建对象时应注意几个关键应用规则:

  <1> 避免在循环体中创建对象,即使该对象占用内存空间不大。

  <2> 尽量及时使对象符合垃圾回收标准。比如 myObject = null。

  <3> 不要采用过深的继承层次。

  <4> 访问本地变量优于访问类中的变量。

  (2)应用阶段

  在对象的引用阶段,对象具备如下特征:

  <1> 系统至少维护着对象的一个强引用(Strong Reference);

  <2> 所有对该对象的引用全部是强引用(除非我们显示地适用了:软引用(Soft Reference)、弱引用(Weak Reference)或虚引用(Phantom Reference))。

  强引用(Strong Reference):是指JVM内存管理器从根引用集合出发遍历堆中所有到达对象的路径。当到达某对象的任意路径都不含有引用对象时,这个对象的引用被称为强引用。

  软引用(Soft Reference):软引用的主要特点是有较强的引用功能。只有当内存不够的时候,才回收这类内存,因此内存足够时它们通常不被回收。另外这些引用对象还能保证在Java抛出OutOfMemory异常之前,被设置为null。它可以用于实现一些常用资源的缓存,实现Cache功能,保证大限度地使用内存你而不引起OutOfMemory。

  下面是软引用的实现代码:

import java.lang.ref.SoftReference;
...
A a = new A();
...
// 使用a
...
// 使用完了a, 将它设置为soft引用类型,并且释放强引用
SoftReference sr = new SoftReference(a);
a = null;
...
// 下次使用时
if (sr != null) {
a = sr.get();
} else {
// GC由于低内存,已释放a,因此需要重新装载
a = new A();
sr = new SoftReference(a);
}

  软引用技术的引进使Java应用可以更好地管理内存,稳定系统,防止系统内存溢出,避免系统崩溃。因此在处理一些占用内存较大且生命周期较长,但使用并不繁地对象时应尽量应用该技术。提高系统稳定性。

  弱引用(Weak Reference):弱应用对象与软引用对象的大不同在于:GC在进行垃圾回收时,需要通过算法检查是否回收Soft应用对象,而对于Weak引用,GC总是进行回收。Weak引用对象更容易、更快地被GC回收。Weak引用对象常常用于Map结构中。

import java.lang.ref.WeakReference;  
                              ...  
                                 
                             A a = new A();  
                             ...  
 
                               // 使用a  
                              ...  
                                  
                               // 使用完了a, 将它设置为Weak引用类型,并且释放强引用  
                               WeakReference wr = new WeakReference(a);  
                               a = null;  
                             ...  
                              // 下次使用时  
               if (wr != null) {  
                    a = wr.get();  
            } else {  
                                   a = new A();  
                wr = new WeakReference(a);  
            }