通用技术 如何降低你的 java 应用内存使用???——特殊引用类

在路上 for 求职面试圈 · 2018年03月27日 · 最后由 在路上 回复于 2018年03月27日 · 2156 次阅读

前言

为了降低程序运行期间内存的占用,java 创建了 软引用、弱引用和虚引用。

java 常见类引用

  • 强引用:
    • 说明:程序创建一个对象,并把这个对象赋给一个引用变量。
  • 软引用:
    • 说明:软引用需要通过 SoftReference 类来实现,当对象只具有软引用时,它有可能被垃圾回收机制回收。对于只有软引用的对象,当系统内存空间足够时,它不会被系统回收,程序也可使用该对象;当系统内存空间不足时,系统将会回收它。软引用通常用于对内存敏感的程序中。
  • 弱引用:
    • 说明:弱引用通过 WeakReference 类实现,弱引用和软引用很像,但弱引用的饮用级别更低。对于只有弱引用的对象而言,当系统垃圾回收运行时,不管系统内存是否足够,总会回收该对象所占用的内存。
  • 虚引用:
    • 说明:虚引用通过 PhantomReference 类实现,虚引用完全类似于没有引用。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引队列 (ReferenceQueue) 联合使用。
    • 被虚引用的对象被垃圾回收后,虚引用将被添加到引用队列中。

使用这些引用类的好处:

  • 使用这些引用类,可以避免在程序执行期间将对象留在内存中。如果我们以软引用、弱引用、虚引用的方式引用对象,这样垃圾收集器就能够随意的释放对象。
  • 备注:如果使用这些特殊的引用类,就不能保留对对象的强引用。如果保留了对对象的强引用,那么就会浪费这些类所提供的任何好处。

如下面代码所示,可以在程序运行期间,强制垃圾回收,回收代码中的弱引用

public class TestReference {
    public static void main(String[] args) {
        String str = new String("Hello World");

        //创建弱引用
        WeakReference wr = new WeakReference(str);

        //切断str和"hello world"之间的引用
        str = null;

        //取出弱引用所引用的对象
        System.out.println("垃圾回收前,弱引用对象:" + wr.get());

        //强制垃圾回收
        System.gc();
        System.runFinalization();

        //再次取出弱引用所引用的对象
        System.out.println("垃圾回收后,弱引用对象:" + wr.get());
    }
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 2 条回复 时间 点赞

问一个问题,哪种类适合使用弱引用呢。。。

Ikaros灬 回复

我也是刚学习,具体项目还没应用过,欢迎大家多多指导

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册