Странные WeakReference в Android остаются в живых после GC? - PullRequest
0 голосов
/ 27 декабря 2018

вот код

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final  WeakReference<Obj> weakReference = new WeakReference<>(new Obj());
//        just add some code here, gc "works"
//        int i = 1;
//        Log.d(TAG, "onCreate: just do something");
        triggerGc();
        if (weakReference.get() != null) {
            Log.d(TAG, "onCreate: NOT reclaimed " + weakReference.get().toString());
        } else {
            Log.d(TAG, "onCreate: reclaimed");
        }
    }

Слабо ссылающийся объект не был возвращен!Но GC действительно произошел.

D/EnvTest: triggering Gc...
I/art: Starting a blocking GC Explicit
I/art: Explicit concurrent mark sweep GC freed 330(35KB) AllocSpace objects, 0(0B) LOS objects, 39% free, 4MB/7MB, paused 115us total 11.164ms
D/EnvTest: Gc triggered.
D/EnvTest: onCreate: NOT reclaimed com.example.yves.envtest.MainActivity$Obj@cd043f8

, если мы добавим некоторый код, такой как запись в журнал или назначение, перед triggerGc (), объект будет восстановлен, как мы ожидаем.

здесьМетод triggerGc ()

    private void triggerGc() {
        Log.d(TAG, "triggering Gc...");
        Runtime.getRuntime().gc();
        Runtime.getRuntime().runFinalization();
        Log.d(TAG, "Gc triggered.");
    }

Объект здесь

   static class Obj{
        @Override
        protected void finalize() throws Throwable {
            super.finalize();
            Log.d(TAG, "finalize: ");
        }
    }
...