2010-08-27 23 views
13

Po niedawnym wdrożeniu w teście systemowym, jedna z naszych serwletów zaczęła działać znacznie ostrzej niż zwykle i zauważyliśmy, że pamięć zaczęła się wspinać, a weblogia w końcu zginęła. Mój stażysta, byłem bardzo dumny, odkryłem źródło wycieku pamięci.JAXBContext.newInstance wyciek pamięci

Kiedykolwiek wniosek przychodzi, linia ta jest wywoływana:

JAXBContext jc = JAXBContext.newInstance(“ruby.oracle_servlet.schemas”); 

Z jakiegoś powodu, obiekt nigdy nie dostaje śmieci zebrane. Kiedy już zrobiliśmy to statycznie i przenieśliśmy się tam, gdzie go zainicjowaliśmy, nasz wyciek pamięci zniknął.

Kolejny z naszych programistów umieścił tę linię w pętli while w autonomicznej aplikacji java, a także zobaczył, że pamięć działa w górę iw górę.

Czy ktoś ma jakieś pomysły, dlaczego ten obiekt nie zbiera śmieci?

Dzięki

Odpowiedz

8

których realizacja & wersja JAXB używasz? Jeśli korzystasz z implementacji referencyjnej dołączonej do środowiska Java SE 6, to jest to Metro (https://jaxb.dev.java.net/).

Oto niektóre z tam związanych z pamięcią błędów:

Jeśli zdarzy się przy użyciu realizację Moxy (http://www.eclipse.org/eclipselink/moxy.php) to mogę pomóc debug ty.

Dobrą wiadomością jest to, że JAXBContext jest wątkowo bezpieczny i powinien zostać utworzony tylko raz i ponownie użyty. Ponowne użycie JAXBContext wydaje się również rozwiązywać problem wycieku pamięci.

Aby uzyskać więcej informacji, patrz:

+2

link aktualizacja: http://jaxb.java.net/guide/Performance_and_thread_safety.html –

+0

@ThangPham - Dzięki, zaktualizowałem moją odpowiedź z nowym linku podałeś. –

+0

Czy jest to również znany problem z wydaniem JAXB dla Java 7? Podane rozwiązanie nadal będzie obowiązywać, ale dobrze byłoby wiedzieć, czy nadal jest to coś, na co warto uważać. –

1

Tak, to jest przeciek. Załaduje klasę "ruby.oracle_servlet.schemas", za każdym razem, gdy wywoływana jest ta metoda.

JAXBContext.newInstance(“ruby.oracle_servlet.schemas”)