Mamy 32-bitową usługę Windows, która wycieka z pamięci - generowany jest wyjątek OutOfMemory. Jest to plik wykonywalny .net 4.0 uruchomiony na Windows Server 2003. Podczas debugowania plików zrzutu awaryjnego za pomocą WinDbg, widzę, że większość pamięci jest w rzeczywistości zarezerwowana i nie jest zatwierdzona. Czy pamięć zarezerwowana może spowodować wyjątek braku pamięci
Jak widać z WinDBG zrzucie istnieje 2,5 Gb niesklasyfikowanych zużycie pamięci, a większość z nich jest faktycznie 2,1 Gb zastrzeżone pamięci (MEM_RESERVE). Mam doświadczenie w debugowaniu zgniłych reklam, ale ten scenariusz jest dla mnie czymś nowym. MEM_COMMIT jest rzucić OK - 564,270 Mb udało wielkość sterty jest ABT 82 Mb
Ja również sprawdzone rodzimych stosy, aby zobaczyć, czy są duże ilości danych zakonserwowane, ale nie mógł znaleźć niczego podejrzanego nie bądź
Więc moje pytanie jest - czy to możliwe, że MEM_RESERVED może spowodować wyjątek OOM? Jeśli tak, jak mogę go debugować, zobacz dlaczego/jak ogromna ilość pamięci jest rezerwowana? Gdzie indziej szukać, co może być problemem?
Jeśli wymagane są inne informacje, poproś o to, a zaktualizuję mój wpis.
dziękuję za odpowiedź, czy wiesz przez przypadek, jak mogę zobaczyć, co rezerwuje tę ogromną pamięć w WinDbg? – Michael
Zakładając, że pamięć jest używana przez zarządzany obiekt, możesz je sprawdzić za pomocą '! Dumpheap' i'! Do'. Jednakże, biorąc pod uwagę, że wyjście '! Eeheap' pokazuje, że zarządzana sterty jest mała, zakładam, że coś innego zarezerwowało tę pamięć. –
Czy możesz określić, co jeszcze może zarezerwować pamięć? Jestem zdezorientowany, ponieważ oczekiwałbym, że "coś" jest albo na sterowanej kupie, albo jakimś rodzimym zasobem na rodzimych hałdach - żadne z nich nie wskazuje na coś podejrzanego. Co jeszcze może zarezerwować pamięć? Z przyjemnością sprawdzę to od razu. – Michael