2011-06-22 18 views
7

Zastanawiam się, jak działa garbage collection, gdy masz klasę z odbiciem używaną do uzyskania wartości pól. W jaki sposób JVM ma świadomość, że wartości odwołujące się do tych pól są dostępne, a zatem nie kwalifikują się do usuwania śmieci w chwili obecnej, kiedy formalna składnia języka nie jest używana w celu uzyskania do nich dostępu?Zbieranie i odbieranie śmieci

niewielki fragment wskazujący problem (choć odbicie jest przecenić tutaj):

/** 
* 
*/ 

import java.lang.reflect.Field; 

public class B { 
    protected B previous = null, next = null; 

    /** 
    * 
    */ 
    public B(B from) { 
     this.previous = from; 
    } 

    public void transition(B to) { 
     this.next = to; 
    } 

    public B next() { 
     try { 
      Field f = getClass().getField("next"); 
      f.setAccessible(true); 
      try { 
       return (B)f.get(this); 
      } finally { 
       f.setAccessible(false); 
      } 
     } catch (Exception e) { 
      throw new IllegalStateException(e); 
     } 
    } 

    public B previous() { 
     try { 
      Field f = getClass().getField("previous"); 
      f.setAccessible(true); 
      try { 
       return (B)f.get(this); 
      } finally { 
       f.setAccessible(false); 
      } 
     } catch (Exception e) { 
      throw new IllegalStateException(e); 
     } 
    } 
} 

Wiwaty,
Chris

+0

Interesujące pytanie. Czy zainspirowała go jakaś osadzona aplikacja Java? –

+0

Czy możesz dołączyć fragment kodu, aby wyjaśnić, co masz na myśli przez "klasę z refleksją używaną do uzyskania wartości pól?" –

+0

Właściwie pracuję nad testem dla sieci, a niektóre pola są dostępne dzięki refleksji. Zastanawiasz się, w jaki sposób odbicie ma wpływ na wykorzystanie pamięci, być może z obiektami przechowującymi JVM, których nie jest pewien. –

Odpowiedz

10

W przypadku uzyskiwania dostępu do pola instancji, a następnie będzie nadal potrzebuję odniesienia do tej instancji. W tej sprawie nie byłoby żadnych nieprawidłowości w GC.

+0

Dzięki, to ma sens :) –

5

Aby uzyskać dostęp do pola obiektu, musisz mieć odniesienie do tego obiektu. Jeśli uzyskasz do niego dostęp za pomocą refleksji lub bezpośrednio, nie ma znaczenia, czy masz silne odniesienie do obiektu.

1

To trochę dziwny przypadek testowy: używasz odbicia, aby uzyskać dostęp do "tego". Z definicji "this" jest aktywne, gdy jest używane w metodzie instancji klasy deklarującej, więc nie będzie GCed.

Ale bardziej do rzeczy, refleks po prostu pozwala manipulować polami, itp. W obiektach, do których już masz odniesienia. To jest klucz - jeśli możesz podać Odbicie instancji, którą chcesz zbadać, wyraźnie masz nadal odniesienie do obiektu, a więc pozostaje on żywy.

Powiązane problemy