保持对对象的引用,以便将来进行方法调用,或者每次在长方法中获取对象

时间:2017-09-23 01:40:59

标签: java garbage-collection

class A {
    void method1() {
        B b = new B();
        C c = new C();

        // Option 1
        List<Object> cachedObject = b.method1();
        c.method1(cachedObject);
        c.method2(cachedObject);

        // Option 2
        c.method1(b.method1());
        c.method2(b.method1());
    }
}

class B {
     List<Object> method1() {
     }
}

class C {
     void method1(List<Object> a) {
     }

     void method2(List<Object> a) {
     }
}

在选项2中,c.method1()的参数在返回之后是否可用于垃圾收集结果与选项1相比更好,在选项1中我们缓存对象并在两个方法调用中使用它c.method1( )和c.method2()考虑到在c.method1()和c.method2()调用之间发生了耗时的操作,因此在此期间仍然引用了缓存的对象,并且不能用于垃圾收集。

从内存利用率的角度来看,考虑到b.method1()返回的对象是巨大的(500MB +),哪个选项可以更好地工作?

1 个答案:

答案 0 :(得分:0)

在Memory Utilization&amp; amp;性能。正确的答案实际上取决于您的情况。以下是我要问的一些问题......

  • 你的记忆限制是什么?保持这个对象会导致你的JVM用尽堆空间吗?
  • 您的表现要求是什么?这个对象需要一段时间才能创建,并且会重新创建它会使应用程序的速度降低到不可接受的程度吗?
  • 垃圾收集从未得到保证,那么您同时在内存中有两个这样的对象有什么风险呢?
  • 您需要使用此对象多少次/地点?它是在单独的线程上传递并异步使用还是在使用之间会有很大差距?

我提供的一个解决方案是查看Java的WeakReference类。此类允许您维护对不阻止垃圾回收的对象的弱引用。无论何时你想使用它,你都会进行空检查,如果是垃圾收集,你可以重新创建它。当您绝对不希望在内存中存在大对象的多个实例时,这很有用,因为一旦旧引用被垃圾回收,弱引用将只为null。