2016-09-21 16 views
10

Rozwiązuję problem z dziwnym wyciekiem pamięci. Jest to specyficzne dla Java8, nie dzieje się na 7u79.Nieszczelność pamięci Java - jmap nie pokazuje klas, ale jstat robi

Nie mam dostępu do kodu Java. wiem dokładnie jakie działanie użytkownika powoduje przeciek, wiem, że wyciek jest o zajęciach (nie sterty) i zajęcia obrażając są łatwe do wykrycia z + TraceClassLoading + TraceClassUnloading:

[Loaded com.mastercard.mcwallet.sdk.xml.allservices.ShoppingCartRequest$JaxbAccessorF_oAuthToken from __JVM_DefineClass__] 
[Loaded com.mastercard.mcwallet.sdk.... thousand similar classes per one user action... ] 

Klasy te wydają się zwiększać wyjście licznika klasy przez jstat -class:

Loaded Bytes Unloaded Bytes  Time 
14045 26138.8  0  0.0  110.00 << buggy user action 
14675 26754.6  0  0.0  110.05 
15300 27364.9  0  0.0  110.10 
15304 27370.9  0  0.0  110.11 
15304 27370.9  0  0.0  110.11 
15304 27370.9  0  0.0  110.11 
15306 27374.0  0  0.0  110.11 
15306 27374.0  0  0.0  110.11 
15306 27374.0  0  0.0  110.11 
15306 27374.0  0  0.0  110.11 << buggy user action 
15930 27982.2  0  0.0  110.18 
16553 28589.3  0  0.0  110.23 
16553 28589.3  0  0.0  110.23 

Chodzi o to, że te zajęcia są nigdy śmieci zebrane z metaspace, nigdy [Unloaded] i nie wykazują w jmap -clstats. Raporty Komenda niższa liczba klas, liczba nie wzrośnie, nie ma żadnych podejrzanych ładowarki klasy:

class_loader classes bytes parent_loader alive? type 

<bootstrap>  2574 4493256 null   live <internal> 
0x0000000087d016d0  1  1471 0x000000008237f088  dead sun/reflect/[email protected] 
... some lines omitted ... 
0x000000008237f088  6505 12228227  0x0000000080383938  dead org/apache/catalina/loader/[email protected] 
... some lines omitted ... 
total = 600  14002 25351427   N/A   alive=1, dead=599   N/A 

Czy ten pierścień dowolny dzwonek lub przynosi żadnych wskazówek mogę przekazać do programistów? Mówią, że nie są w stanie zlokalizować wycieku. Czy mogę powstrzymać ten przeciek przez błąkanie się z opcjami JVM?

+0

Problem tylko z 'MetaSpace'? a co z 'kupą'? i czy możesz również podać statystyki użycia pamięci procesów 'Java'? –

+0

Tylko Metaspace, sterty są stabilne i niepełne. Jakie statystyki dokładnie? – kubanczyk

+0

Mam na myśli, jak szybko rośnie wykorzystanie pamięci procesowej Java? –

Odpowiedz

2

Przypuszczam, że JaxB ładuje klasy do twojej pamięci, które nie są śmieciami zbieranymi. Metaprzestrzenie nie zostanie opróżnione, jeśli Klasy nie zostaną rozładowane.

Sprawdź dla JaxB memory issue for Java 8. Myślę, że możesz pozbyć się tego wyjątku, zamieniając zależność wersji api lub przełączając się na dodatkowy parametr:

-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true 
6

Jeśli niepotrzebne klasy są niedostępne do rozładowania, to muszą być zapisane w pamięci podręcznej gdzieś w aplikacji i rozumiem, że Twoim celem jest znalezienie tego, gdzie jest i podanie tych informacji programistom.

Możesz spróbować użyć Eclipse Memory Analyzer (MAT), aby sprawdzić zrzut sterty, a także pokazać obszary problemowe, klasy i instancje, które zawierają linki do klas błędów.

Powiązane problemy