Sobes.tech
Middle

Как да определите кой обект в Java е боклук?

sobes.tech AI

Отговор от AI

Обект се счита за боклук в Java, когато няма повече препратки към него от активните части на програмата. Това се случва в следните случаи:

  • Няма препратки от коренови обекти (коренови референции): Кореновите обекти включват препратки от:

    • Локални променливи в активни нишки.
    • Статични променливи.
    • JNI препратки (обекти, достъпни от нативен код).
  • Само препратки от други "боклуци" обекти: Дори ако обектът O1 препраща към обект O2, но нито O1, нито O2 имат препратки от коренови обекти, и двата обекта се считат за боклук.

Пример:

// Коренова препратка от статична променлива
static Object staticObject = new Object();

// Коренова препратка от локална променлива в активен метод
public void someMethod() {
    Object localObject = new Object(); // Препратка от локална променлива
    // След изход от someMethod, localObject става недостъпен
}

// Пример за "боклук" обект
public Object createGarbage() {
    Object obj1 = new Object();
    Object obj2 = new Object();
    obj1 = obj2; // obj1 сега препраща към същия обект като obj2
    // Оригиналният обект, към който се е отнасял obj1, вече не е достъпен и се счита за боклук
    return obj2; // Връща препратка към жив обект
}

Garbage collector-ът в Java определя недостъпните обекти, използвайки алгоритъма "следене на достижимост" (reachability tracing), започвайки от кореновите обекти. Обектите, до които не може да се достигне чрез верига от препратки от кореновите обекти, се считат за недостъпни и подлежат на събиране.