Hoe Memory Leaks te vinden en op te lossen in Windows 10/8/7
EEN Geheugenlek is een misplaatsing van bronnen in een computerprogramma als gevolg van verkeerde geheugentoewijzing. Het gebeurt wanneer een RAM-locatie die niet in gebruik is, niet wordt vrijgegeven. Een geheugenlek moet niet worden verward met een lek in de ruimte, wat verwijst naar een programma dat meer RAM gebruikt dan nodig is. Een geheugenlek op een Windows 10/8/7-systeem zou hebben plaatsgevonden wanneer het geheugen gewoon niet toegankelijk is, ondanks dat het niet in gebruik is.
Geheugenlekken in Windows 10
Voordat u begint, moet u weten dat geheugenlek een softwareprobleem is om te debuggen - bijvoorbeeld in Java, JavaScript, C / C ++, Windows, enz. Het fysiek vervangen van RAM of de harde schijf is niet vereist.
Waarom is het slecht
Het is duidelijk dat een geheugenlek slecht is omdat het een fout is, een fout in het systeem. Maar laten we uitvinden hoe het precies invloed heeft op het systeem:
- Omdat het geheugen niet wordt vrijgegeven, zelfs wanneer het niet wordt gebruikt, resulteert dit in geheugenverarming.
- Uitputting van het geheugen resulteert in software-veroudering.
- Gereduceerd beschikbaar geheugen leidt tot een langere responstijd en slechte prestaties van het systeem.
- Ongecontroleerd geheugenlek kan uiteindelijk leiden tot het crashen van een toepassing.
Om een geheugenlek te identificeren, moet een programmeur toegang hebben tot de broncode van het programma.
Lokaliseren van het lek
Om een probleem op te lossen, moeten we het eerst identificeren. De basisstappen om een geheugenlek te lokaliseren zijn:
- Bevestiging: Bepalen of er een lek is opgetreden.
- Een geheugenlek vinden in de kernelmodus: Lokaliseren van een lek veroorzaakt door een stuurprogrammaonderdeel in de kernelmodus.
- Het vinden van geheugenlekken in de gebruikersmodus: Lokaliseren van een lek veroorzaakt door een driver of app voor de gebruikersmodus.
Geheugen toewijzing
Er zijn verschillende modi waarin applicaties RAM toewijzen. Als de ruimte na gebruik niet wordt vrijgegeven, zal het geheugenlek optreden, ongeacht de wijze van toewijzing. Enkele veelvoorkomende toewijzingspatronen zijn:
- HealAlloc-functie voor toewijzing van heap-geheugen. De C / C ++ runtime-equivalenten zijn malloc en nieuw.
- VirtualAlloc-functie voor directe toewijzing vanuit OS.
- Kernel32 API's om kernelgeheugen voor de app vast te houden. Voorbeeld, CreateFile, CreateThread.
- User32 API's en Gdi32 API's.
Voorkomen van geheugenlekken
We weten allemaal dat voorkomen beter is dan genezen, dus hier zijn enkele manieren om een geheugenlek te voorkomen.
Bewakingsgewoonten
U moet opletten voor abnormaal RAM-gebruik door individuele programma's en toepassingen. U kunt naar Windows Taakbeheer gaan door op te drukken CTRL + SHIFT + ESC en voeg de kolommen toe zoals Handles, User Objects, GDI Objects, enz.
Hiermee kunt u eenvoudig het gebruik van bronnen volgen.
Microsoft-hulpprogramma's om geheugenlekken te diagnosticeren
Verschillende tools diagnosticeren geheugenlekken voor verschillende toewijzingsmodi:
- Application Verifier diagnosticeert heaplekken.
- UMDH (een onderdeel van Windows Debugging Tools) diagnosticeert lekken voor individuele processen door heap-geheugenallocaties te bewaken.
- Trace Capture voor een grondige analyse van het RAM-gebruik.
- Xperf traceert ook toewijzingspatronen.
- CRT Debug Heap bewaart niet alleen heap allocaties, maar maakt ook codeermethoden mogelijk om lekken te minimaliseren.
- JavaScript Memory Leak Detector debugt geheugenlekken in codes.
Gebruikstips
- Gebruik kernel HANDVATs en andere slimme aanwijzers voor Win32-resources en heap-toewijzingen.
- Klassen ophalen voor automatisch resourcebeheer voor kerneltoewijzingen uit de ATL-bibliotheek. C ++ standaard heeft auto_ptr voor heap allocaties.
- Kapselen COM-interface pointers in "slimme pointers" met behulp van _com_ptr_t of _bstr_t of _variant_t.
- Controleer de .NET-code op abnormaal geheugengebruik.
- Vermijd meerdere exitpaden voor functies om toewijzingen te laten vrijkomen van variabelen in de meeste blokken aan het einde van een functie.
- Gebruik alleen native uitzonderingen nadat alle toewijzingen in het _eindelijke blok zijn vrijgegeven. Wikkel alle heap en verwerk toewijzingen in slimme aanwijzers om C ++ -uitzonderingen te gebruiken.
- Bel altijd de PropVariantClear functie vóór het opnieuw initialiseren of verwijderen van een PROPVARIANT-object.
Problemen oplossen met geheugenlekken in Windows
Net als de verschillende manieren om geheugenlekken te voorkomen, zijn er verschillende manieren om geheugenlekken te stoppen.
1] Processen sluiten en opnieuw opstarten.
Als u ziet dat een onnodig proces te veel RAM-geheugen in beslag neemt, kunt u het proces beëindigen in Taakbeheer. U moet het apparaat opnieuw opstarten zodat de vrijgekomen ruimte beschikbaar is voor gebruik door andere processen. Zonder een Herstart geheugenlek probleem zal niet worden opgelost. Een bepaald proces met bugs om de pc te vertragen, is Runtime Broker. Probeer of het uitschakelen van dat alleen werkt.
2] Diagnostische hulpprogramma's voor geheugen
Om toegang te krijgen tot de ingebouwde Memory Diagnostic Tool voor Windows:
- Bewaar al je belangrijke werk.
- druk op Win + R om de te openen Rennen venster.
- Typ de opdracht mdsched.exe in de Rennen venster.
- Start de pc opnieuw op.
- Voer na een herstart een basisscan uit of ga voor de 'gevorderd'opties zoals'Testmix'of'Pass aantal'.
- druk op F10 om de test te starten.
Dit zijn nog tijdelijke oplossingen.
3] Controleer op stuurprogramma-updatesVerouderde stuurprogramma's veroorzaken geheugenlekken. Houd alle stuurprogramma's bijgewerkt:
- druk op Win + R en open de Rennen venster. Type devmgmt.msc en druk op Enter. Het brengt je naar de Apparaat beheerder.
- Controleer op verouderde stuurprogramma's en update ze allemaal.
- Voor updates die u misschien hebt gemist, kijkt u in Windows Update.
Dit was eenvoudig.
4] Prestaties optimaliseren
Door Windows aan te passen voor prestaties, wordt alles beheerd, inclusief processorplanning en geheugengebruik om geheugenlekken te voorkomen. Volg deze stappen:
- Klik met de rechtermuisknop op 'Deze pc'en selecteer'gevorderd'instellingen in het linkerdeelvenster.
- Onder de 'gevorderd'tab, ga naar'Prestatie', gevolgd door 'instellingen'.
- Controleren 'Aanpassen voor de beste prestatiesen klik OK.
- Start opnieuw en controleer of het probleem is opgelost.
Als deze eenvoudige oplossing niet werkt, probeer dan de volgende oplossing.
5] Programma's uitschakelen die worden uitgevoerd bij opstarten
Het uitschakelen van de lastige programma's is de enige manier om het probleem met het geheugenlek kwijt te raken. Ga naar Taakbeheer en schakel het probleemopwekkend programma uit. Als u niet weet welke programma's de problemen veroorzaken, doet u het volgende:
- Ga naar 'Taakbeheer'.
- Ga naar 'Opstarten'.
- Schakel de opstartprogramma's uit die u niet standaard hoeft uit te voeren.
6] Defrag Hard Drive
Hoewel Windows 10 dit automatisch voor u doet, moet u de harde schijven mogelijk af en toe defragmenteren om de prestaties te optimaliseren:
- Ga naar 'Deze pc'of'Mijn computer'.
- Klik met de rechtermuisknop op de systeemharde schijf (meestal C: schijf).
- Ga naar 'Hulpmiddelen' onder 'eigenschappen'en selecteer'Optimaliseer'.
- Selecteer de schijf om te defragmenteren en selecteer 'Analyseren'.
Start de computer opnieuw op na de nieuwe fragmentatie.
7] ClearPage-bestand bij afsluiten
Het wordt nu complex - maar maak je geen zorgen. U kunt als volgt het Page-bestand bij elke afsluiting wissen:
- Type regedit op Zoeken om de Register-editor te starten.
- Vul dit pad in: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager Geheugenbeheer
- Wijzig de waarde van ClearPageFileAtShutDownloaden naar '1'.
- Sla de wijzigingen op en start het apparaat opnieuw op.
Dit zou het moeten doen.
9] Superfetch uitschakelen
Deze Windows-service optimaliseert de prestaties door de opstarttijd te minimaliseren. Hiermee kan Windows het RAM-gebruik beheren. Het leven na het uitschakelen van Superfetch is niet handig, maar doe het als het moet. Probeer dit in ieder geval alleen om het probleem te isoleren:
- Zoeken services.msc en ga naar Services Manager.
- Zoeken 'Superfetch'en klik erop met de rechtermuisknop om naar' te gaaneigenschappen'.
- Selecteer 'Hou op'.
- Ook 'onbruikbaar maken'de service uit het vervolgkeuzemenu.
- Start de pc opnieuw op en controleer of de prestaties zijn verbeterd.
Schakel Superfetch in als deze niet werkte.
10] Controleer op malware
Gebruik een externe antivirussoftware of Windows 10's interne Windows Defender om malware te scannen en te elimineren. Zorg ervoor dat de antivirus is bijgewerkt om uw besturingssysteem te ondersteunen, zodat dit uiteindelijk niet de oorzaak wordt van het geheugenlek.
Elke oplossing die u ooit nodig zou kunnen hebben om geheugenlekken te vinden of te voorkomen, is hier. U kunt meer lezen over geheugenlekken op MSDN en Microsoft.