SoftReference не очищается Java GC - PullRequest
       44

SoftReference не очищается Java GC

0 голосов
/ 24 февраля 2019

Я пытался понять SoftReferences в Java, который в основном обеспечивает очистку памяти объектов SoftReferenced перед броском StackOverflowError .

public class Temp 
{

    public static void main(String args[])
    {
        Temp temp2 = new Temp();
        SoftReference<Temp> sr=new SoftReference<Temp>(temp2);

        temp2=null;
        Temp temp=new Temp();
        temp.infinite(sr);

    }

    public void infinite(SoftReference sr)
    {

        try
        {
            infinite(sr);
        }
        catch(StackOverflowError ex)
        {
            System.out.println(sr.get());
            System.out.println(sr.isEnqueued());
        }

    }
}

Однако результат выше был

test.Temp@7852e922
false

Может кто-нибудь объяснить мне, почему объект не был очищен GC?Как я могу заставить это работать?

1 Ответ

0 голосов
/ 24 февраля 2019

Похоже, у вас может быть некоторая путаница с StackOverFlowError и OutOfMemoryError.Ошибка StackOverFlowError и OutOfMemoryError различна.StackOverFlowError происходит, когда в стеке вызовов нет места: OutOfMemoryError происходит, когда JVM не может выделить память в пространстве кучи для нового объекта.Ваш код приводит к StackOverflow: это означает, что память стека заполнена, а не пространство кучи.Я полагаю, что будет достаточно места для хранения вашего SoftReference, поэтому он не GCd объекта.

...