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
Interesujące pytanie. Czy zainspirowała go jakaś osadzona aplikacja Java? –
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?" –
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. –