Speicher wird nicht freigegeben

09/07/2008 - 08:58 von Thomas Kehl | Report spam
Hallo zusammen.

Ich habe folgendes Problem:
Ein von mir erstellter Windows-Dienst làuft auf einem Server und erzeugt
PDF's (mit der .NET-Componente von List&Label). Nun ist der Dienst nach der
Erstellung von ca. 2000 PDF's gecrasht mit folgender Exception:

System.AccessViolationException: Es wurde versucht, im geschützten Speicher
zu lesen oder zu schreiben. Dies ist hàufig ein Hinweis darauf, dass anderer
Speicher beschàdigt ist.

Das Ganze sagt mir nun nicht sehr viel. Was ich nun aber festgestellt habe
ist, dass der Dienst zum Zeitpunkt des crash's ca. 900MB Speicher belegt.
Wird der Dienst gestartet, so ist der Speicherverbrauch bei ca. 120MB. Ich
habe nun festgestellt, dass für die Erstellung des PDF's der Verbrauch um
2MB hoch geht, danach aber nur um 1.5MB zurück.
Meine Frage ist nun, gibt es Tools, mit dem ich z.B. an einen laufenden
Service connecten kann und schauen, was für Objekte nicht freigegeben
wurden? - Bzw. mit denen ich grundsàtzlich schauen kann, welche Objekte sind
aktuell gerade im Speicher geladen und verbrauchen wieviel Speicher?
Zudem noch die Frage: Denkt ihr, dass obige Exception mit dem
Speicherverbrauch und dem "nicht freigeben" zusammenhàngen kann? - Ich gehe
davon aus, bin mir aber nicht sicher.

Besten Dank für eure Unterstützung!

Grüsse, Thomas
 

Lesen sie die antworten

#1 Kerem Gümrükcü
09/07/2008 - 09:24 | Warnen spam
Hallo Thomas,

Ich habe folgendes Problem:
Ein von mir erstellter Windows-Dienst làuft auf einem Server und erzeugt
PDF's (mit der .NET-Componente von List&Label). Nun ist der Dienst nach der
Erstellung von ca. 2000 PDF's gecrasht mit folgender Exception:

System.AccessViolationException: Es wurde versucht, im geschützten Speicher
zu lesen oder zu schreiben. Dies ist hàufig ein Hinweis darauf, dass
anderer Speicher beschàdigt ist.




Nun das ist zwar eine eindeutige Aussage und würde meiner Meinung nach
besagen, das irgend ein Teil deines Programmes entweder verucht ein Stück
speicher zu lesen oder zu beschreiben, was er nicht darf. Das ist i.d.R. ein
falscher
"Zeiger", der auf etwas zeigt, was er nicht freigeben/öresen/schreiben,
etc,. darf.
Schau noch mal in die Windows Logs, ob da was spezielles steht,...


Das Ganze sagt mir nun nicht sehr viel. Was ich nun aber festgestellt habe
ist, dass der Dienst zum Zeitpunkt des crash's ca. 900MB Speicher belegt.



Diese Speichernageben sind nicht der reale Speicherverbrauch, die Du mit
dem TaskManager oder dem Process Explorer bekommst. Genau Informationen
warum das so ist, bekommst Du im Netz,...

Wird der Dienst gestartet, so ist der Speicherverbrauch bei ca. 120MB. Ich
habe nun festgestellt, dass für die Erstellung des PDF's der Verbrauch um
2MB hoch geht, danach aber nur um 1.5MB zurück.



Das muss nichts heissen, kann aber auf einen unsaubere freigabe von Heap
Speicher deuten,...das müsste man mal profilen, bzw. debuggen

Meine Frage ist nun, gibt es Tools, mit dem ich z.B. an einen laufenden
Service connecten kann und schauen, was für Objekte nicht freigegeben
wurden? - Bzw. mit denen ich grundsàtzlich schauen kann, welche Objekte
sind aktuell gerade im Speicher geladen und verbrauchen wieviel Speicher?



Wenn es sich um einen reinen .NET Service handelt und Du auch Symbole dafür
hast, dann suche mal mit google einfach nach den begriffen "Debugging .NET
Service"
Bei einem nativen Service, der nicht dir gehört, musst Du mit einem Debugger
wie
WinDbg oder OllyDbg ran, das wird dann schwieriger, da Du mit Assembler und
in den Interna des Prozesses, also auf unterer Ebene debuggen musst,...

Zudem noch die Frage: Denkt ihr, dass obige Exception mit dem
Speicherverbrauch und dem "nicht freigeben" zusammenhàngen kann? - Ich gehe
davon aus, bin mir aber nicht sicher.



Ich glaube eher, das es ein "wilder" Zeiger ist, also ein Fehler im
Programm.
Man muss immer im Hinterkopf behalten, das Windows mit Paging arbeitet,
d.h. Du hast quasi 2 bzw. 3 GB (mit /3GB boot.ini switch!) User-Space
Speicher
(Pro -Prozess!) zur Verfügung, der immer mit der Swapfile ergànzt wird, wenn
kein realer Speicher mehr zur Verfügung steht. Solange Du keinen Nachricht
von
Windows bekommst, das Du keinen Virtuellen Speicher mehr hast, also
Swapfile,
sollte alles klappen, auch wenn deine Festplatte rattert und swapt wie irre!

Generell gilt: Wenn Du irgendwas an Speicher reservierst, dann gib es nach
beendigung frei, ganz wichtig,. Ich komme von C/C++ und Asm, da macht
man so was schon automatisch. Das.NET nimmt Dir halt viel ab,...

Schau Dir mal die GC-Klasse des .NET an, das kann Dir bei Speicherfragen
auch helfen,...

Was die Komponente für die PDFs intern macht, kann ichnicht sagen, weil
ich sie nicht kenne, aber wenn dafür Symbole verfügbar sind, dann kann Dir
das schon viel über den Ablauf der Komponente sagen. Ansonsten kannst
Du auch mal den Hersteller anschreiben,, was er denn davon hàllt, wenn Du
alle potentiellen eigenen Fehlerquellen ausgeschlossen hast,...

Sicherlich habe andere hier auch noch ideen,...

Ach so, zu der Frage mit dem Speicher und .NET. Das geht mit dem Tool:

[How To: Use CLR Profiler]
http://msdn.microsoft.com/en-us/lib...79205.aspx

http://download.microsoft.com/downl...ofiler.exe

Grüße

Kerem
Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.codeplex.com/restarts
Latest Open-Source Projects: http://entwicklung.junetz.de
"This reply is provided as is, without warranty express or implied."

Ähnliche fragen