2016-11-02 14 views
9

Występuję w problemach, upewniając się, że kontekst aplikacji wiosennej, który niszczyłem, całkowicie zniknął i nie mogę zobaczyć, że obiekt jest zbierany śmieci. Kiedy patrzę na instancję w VisualVM, widzę, że istnieje wiele wyjątkowych odniesień do kontekstu i fabryki fasoli, które pozostają, gdy kontekst zostanie zamknięty i zniszczony. Wszystko to ma związek z początkową konfiguracją fabryki fasoli (podczas odświeżania metody AbstractApplicationContext), która rejestruje fabrykę fasoli i kontekst z różnymi procesorami do przetwarzania ziarna itp.Czysto zniszcz wiosnę Kontekst aplikacji

Nie ma żadnych metod w fabryce fasoli lub w kontekstach aplikacji (nawet tych odświeżalnych), które robią więcej, niż usuwają najniższy poziom odniesienia do fabryki fasoli. W rezultacie wydaje się, że jest to przeciekająca pamięć, aw pewnych okolicznościach uniemożliwia czyste ponowne utworzenie kontekstu.

Pytam, ponieważ obecnie pracuję nad oprogramowaniem, które może dynamicznie tworzyć/niszczyć, a następnie odtworzyć kontekst (ponieważ moduły są dynamicznie ładowane i rozładowywane), a resztki elementów fabryki kontekstu i fasoli są przyczyną problemy z komponentami, takimi jak spring-data-jpa (szczególnie proxy, które wiąże interfejsy repozytorium z implementacjami repozytoriów).

Czy ktoś wie, w jaki sposób mogę całkowicie i czysto usunąć fabrykę kontekstu i fasoli bez konieczności całkowitego zamykania maszyny wirtualnej, która ją utworzyła?

Odpowiedz

0

Jeśli używasz kontenera IoC Spring w środowisku innym niż aplikacja internetowa; na przykład w środowisku pulpitu bogatego klienta; rejestrujesz hak zamykający za pomocą JVM. Takie postępowanie zapewnia płynne wyłączenie i wywołuje odpowiednie metody niszczenia na pojedynczych ziarnach, aby uwolnić wszystkie zasoby. Oczywiście nadal musisz poprawnie skonfigurować i wdrożyć te wywołania zwrotne.

Aby zarejestrować hak zamykania, należy wywołać metodę registerShutdownHook(), która jest zadeklarowana w klasie AbstractApplicationContext:

Code

import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public final class startup { 

    public static void main(final String[] args) throws Exception { 
     AbstractApplicationContext ctx 
      = new ClassPathXmlApplicationContext(new String []{"beans.xml"}); 

     // add a shutdown hook for the above context... 
     ctx.registerShutdownHook(); 

     // app runs here... 

     // main method exits, hook is called prior to the app shutting down... 
    } 
} 
+0

Dzięki, ale jak już wspomniałem, nie ma to nic wspólnego z zamknięciem całego kontenera. Jest to tworzenie/niszczenie kontekstu aplikacji bez wyłączania kontenera, więc hak zamykający nie pomoże. – Mike

0

połączeń destroy od kontekstu i ustawić wartość null dla wszystkich zmiennych odwołujących instancji kontekstu aplikacji:

AbstractApplicationContext context = new ClassPathXmlApplicationContext(new String []{"beans.xml"}); 

// ... do your stuff 

context.destroy(); 
context = null; 
+0

Dzięki, ale zajrzałem do niszczenia i jest tam tylko w bardzo szczególnym przypadku (gdzie kontekst jest fasolą w innej fabryce fasoli) iw każdym razie domyślna implementacja po prostu wywołuje close(); Najwyraźniej zamykam kontekst i usuwam wszelkie odniesienia do kontekstu, ale chodzi o to, że fabryka fasoli w kontekście aplikacji rejestruje się (lub jest rejestrowana przez) w wielu innych wewnętrznych instancjach na wiosnę i dlatego ogólne odniesienie nigdy nie jest wydany (ustawienie go na null wszędzie w naszym kodzie nie ma żadnego efektu. – Mike

1

Posiadanie looke Po raz kolejny zauważyłem, że nadpisałem metodę kontekstu, aby upewnić się, że fasola została całkowicie zniszczona, ale nie wywoływałem metody , co oznaczało, że nie były wywoływane.

Dodałem to i (większość), jeśli nie wszystkie konteksty są teraz czysto zniszczone i zebrane śmieci. Zakładam, że wszelkie wyjątkowe konteksty, które nie zostały zniszczone, to prawdopodobnie problemy w naszym własnym kodzie z wiszącymi referencjami.

Powiązane problemy