In CMD.exe erstellt "start sh.exe" einen Conhost-Prozess, der 700 MB Speicher benötigt

663
laggingreflex

Ansonsten benötigt Git bash (sh.exe) wenig Speicher, aber wenn es mit dem start sh.exeBefehl von CMD gestartet wird, wird ein conhost.exe-Prozess erstellt, der 3-700 MB Speicher benötigt.

Interessanterweise start cmd /k sh.exedasselbe, aber es erzeugt einen Conhost-Prozess, der nur 8 MB benötigt.

Warum erzeugt der Start von sh.exe mit dem Befehl "start" einen Conhost-Prozess, der so viel Speicher benötigt?

1
Wie messen Sie, wie viel Speicher es benötigt? Und was meinst du mit "Erinnerung"? Meinen Sie physischen Speicher (RAM)? David Schwartz vor 8 Jahren 0
@DavidSchwartz [Task-Manager zeigt ~ 300 MB, Prozess-Explorer zeigt ~ 700 MB (private Bytes)] (http://i.imgur.com/nZG1RW8.png) laggingreflex vor 8 Jahren 0
Also kein physisches Gedächtnis. Dann ist die kurze Antwort, dass sich niemand um den Wert kümmert. Nur das physische Gedächtnis ist knapp, und normalerweise bemühen sich die Leute nicht, den Verbrauch von Ressourcen zu minimieren, die nicht knapp sind. David Schwartz vor 8 Jahren 0
@DavidSchwartz Ich habe die gesamte RAM-Auslastung in Resource Monitor gemessen, und die Spitzen und Abfälle scheinen ähnlich zu sein. Auch wenn es 10 solcher Conhosts gibt, bleibt mein Chrom eine Weile stehen, wenn er nach einiger Zeit aufgerufen wird. Ich habe eine Verbesserung festgestellt, wenn das Starten der Conhosts auf die in meiner Frage beschriebene Weise vermieden wurde (mithilfe von "start cmd sh.exe" anstelle von "start sh.exe"). Meine Frage ist * warum * der Unterschied überhaupt? Warum hockt conhost bei "start sh.exe" im Vergleich zu "start cmd / c sh.exe" so viel mehr Speicher (sogar nur virtuell)? laggingreflex vor 8 Jahren 0
Die Antwort ist, was ich gesagt habe - virtuelles Gedächtnis ist nicht knapp, so dass die Leute den Verbrauch nicht minimieren. Es ist durchaus üblich, ziemlich große Brocken zuzuordnen, falls es später benötigt wird. Dies gilt insbesondere beim Starten eines Prozesses, da Sie vor dem Start einige Aktionen ausführen können, die Sie danach nicht ohne weiteres ausführen können. David Schwartz vor 8 Jahren 0
Installieren Sie das WPT (Teil von Win10 SDK: https://dev.windows.com/en-us/downloads/windows-10-sdk), führen Sie WPRUI.exe aus, wählen Sie VAlloc aus, starten Sie die Ablaufverfolgung, und führen Sie die Datei sh.exe aus Speichern Sie den Trace in einer ETL-Datei. Teilen Sie diese ETL (komprimiert als 7z, um die Größe zu reduzieren) magicandre1981 vor 8 Jahren 0
Erweitern Sie den Eintrag "Ressourcenanalyse", um ** VAlloc-Verwendung ** anzuzeigen. Wählen Sie auch ** Resident Set Analysis ** aus. magicandre1981 vor 8 Jahren 0

1 Antwort auf die Frage

1
magicandre1981

ok, ich habe mir beide Spuren mit WPA.exe angesehen . In der Ablaufverfolgung, die die hohe Speicherbelegung zeigt, wird die Speicherbelegung durch die Erstellung des Bildschirmpuffers bestimmt DoCreateScreenBuffer:

Line #, Process, Commit Stack, Address, Count, Impacting Size, Size 1, conhost.exe (10848), [Root],, 46, 800784384, 800833536 2,, |- ntdll.dll!RtlUserThreadStart,, 31, 800669696, 800673792 3,, | kernel32.dll!BaseThreadInitThunk,, 31, 800669696, 800673792 4,, | |- ConhostV2.dll!ConsoleIoThread,, 13, 800509952, 800509952 5,, | | ConhostV2.dll!ConsoleHandleConnectionRequest,, 13, 800509952, 800509952 6,, | | ConhostV2.dll!ConsoleAllocateConsole,, 13, 800509952, 800509952 7,, | | |- ConhostV2.dll!SetUpConsole,, 10, 800460800, 800460800 8,, | | | |- ConhostV2.dll!AllocateConsole,, 7, 800432128, 800432128 9,, | | | | ConhostV2.dll!DoCreateScreenBuffer,, 7, 800432128, 800432128 10,, | | | | |- ConhostV2.dll!SCREEN_INFORMATION::CreateInstance,, 6, 800415744, 800415744 11,, | | | | | ConhostV2.dll!TEXT_BUFFER_INFO::CreateInstance,, 6, 800415744, 800415744 12,, | | | | | |- ConhostV2.dll!DBCS_SCREEN_BUFFER::CreateInstance,, 4, 599891968, 599891968 13,, | | | | | | ntdll.dll!RtlpAllocateHeapInternal,, 4, 599891968, 599891968 14,, | | | | | | ntdll.dll!RtlpAllocateHeap,, 4, 599891968, 599891968 15,, | | | | | | ntdll.dll!NtAllocateVirtualMemory,, 4, 599891968, 599891968 16,, | | | | | | ntoskrnl.exe!KiSystemServiceCopyEnd,, 4, 599891968, 599891968 17,, | | | | | | ntoskrnl.exe!NtAllocateVirtualMemory,, 4, 599891968, 599891968 18,, | | | | | | ntoskrnl.exe! ?? ::NNGAKEGL::`string',, 4, 599891968, 599891968 

Die start cmd /k sh.exeeine führt diese Speicherzuordnungen nicht durch. Hier werden nur einige Zeichen gedruckt, die nur 69kB benötigen.

Line #, Process, Commit Stack, Address, Count, Impacting Size, Size 7, conhost.exe (10072), [Root],, 2, 81920, 81920 8,, ntdll.dll!RtlUserThreadStart,, 2, 81920, 81920 9,, kernel32.dll!BaseThreadInitThunk,, 2, 81920, 81920 10,, |- ConhostV2.dll!ConsoleIoThread,, 1, 69632, 69632 11,, | ConhostV2.dll!SrvWriteConsole,, 1, 69632, 69632 12,, | ConhostV2.dll!DoSrvWriteConsole,, 1, 69632, 69632 13,, | ConhostV2.dll!DoWriteConsole,, 1, 69632, 69632 14,, | ConhostV2.dll!WriteChars,, 1, 69632, 69632 15,, | ConhostV2.dll!WriteCharsLegacy,, 1, 69632, 69632 16,, | ConhostV2.dll!WriteRegionToScreen,, 1, 69632, 69632 17,, | ConhostV2.dll!ConsolePolyTextOut,, 1, 69632, 69632 18,, | ntdll.dll!RtlpAllocateHeapInternal,, 1, 69632, 69632 19,, | ntdll.dll!RtlpAllocateHeap,, 1, 69632, 69632 20,, | ntdll.dll!RtlpCommitBlock,, 1, 69632, 69632 21,, | ntdll.dll!NtAllocateVirtualMemory,, 1, 69632, 69632 22,, | ntoskrnl.exe!KiSystemServiceCopyEnd,, 1, 69632, 69632 23,, | ntoskrnl.exe!NtAllocateVirtualMemory,, 1, 69632, 69632 24,, | ntoskrnl.exe! ?? ::NNGAKEGL::`string',, 1, 69632, 69632 25,, |, 0x2a657431000, 1, 69632, 69632 

Aber ich habe keine Ahnung, warum das passiert. Führen Sie es immer mit start cmd / k aus.

Ahh! [Ich hatte die Bildschirmpuffergröße auf 9999 gesetzt] (http://i.imgur.com/Tln5IJP.png) Ich weiß nicht, warum es sich nur um `start sh.exe 'handelte, sondern um die Einstellung auf vernünftige Werte, die mit Conhost erstellt wurden nicht so viel Speicherplatz. Verdammt! lol. Danke für die Analyse! laggingreflex vor 8 Jahren 0
Als ich die Spur zum ersten Mal betrachtete, dachte ich auch darüber nach, vergaß aber, sie hinzuzufügen. Aber schön zu hören, dass es jetzt behoben ist :) magicandre1981 vor 8 Jahren 0