Как выгрузить программу из памяти

Обновлено: 21.11.2024

Выгрузка сегмента кода  – это предварительная задача программирования. Оно еще не считается готовым к продвижению в качестве законченной задачи по причинам, которые следует найти на странице обсуждения.

Некоторые сложные приложения, такие как резидентные приложения, демоны и приложения, требующие памяти, выгружают ненужные части приложения во время использования (например, код инициализации, который больше не будет использоваться после запуска приложения), чтобы освободить память и ресурсы. . Продемонстрируйте или объясните, как выгрузить из памяти неиспользуемый участок кода.

Обратите внимание, что достаточно пометить область памяти как доступную для повторного использования системой управления памятью без необходимости демонстрировать обнуление байтов и выполнение перетасовки памяти, если только такие действия не требуются для освобождения кода. сегмент.

Языки, которые не имеют возможности освободить свой сегмент кода (например, языки сценариев), могут быть опущены.

Содержание

ОСНОВНЫЕ [изменить]

В некоторых версиях Basic есть возможность удалять строки кода:

КОБОЛ [ изменить ]

Команда CANCEL в языке COBOL выгружает из памяти динамически загружаемый модуль, содержащий указанную программу или точку входа.

Фурор [ изменить ]

Выражение пренебрежения в Furor удаляет из памяти указанную функцию. Это возможно, потому что каждая функция загружается в динамически выделенный сегмент памяти.

Перейти [ изменить ]

Хотя Go поддерживает подключаемые модули, в настоящее время их невозможно выгрузить после загрузки. Это, вероятно, останется в силе, поскольку соображения времени выполнения (например, остановка горутин, оставление оборванных ссылок) могут сделать это ненадежным. Однако любые объекты, созданные кодом подключаемого модуля в куче, конечно же, будут удалены сборщиком мусора, когда на них больше не будет ссылок.

На практике, если бы исполняемый файл Go требовался для запуска в среде с ограниченным объемом памяти, единственным вариантом было бы попытаться разделить исполняемый файл на цепочку исполняемых файлов меньшего размера, которые вызывали бы следующий в цепочке (возможно, передавая это некоторые параметры) перед выходом. Такая цепочка может быть достигнута с помощью функций из пакета os/exec стандартной библиотеки.

Ио [ изменить ]

Java [править]

Ситуация с Java описана ниже в статье для родственного языка JVM, Kotlin.

Юлия [ изменить ]

Функции Юлии компилируются, и их коду выделяется память "как раз вовремя" при первом запуске кода. Обычно память, используемая в функции, может быть динамически удалена сборщиком мусора, как только эти данные выходят за пределы области действия. Чтобы также очистить память, используемую кодом функции, было бы необходимо определить и запустить новую функцию с тем же именем и типами аргументов, что позволило бы освободить память кода предыдущей функции. На практике это редко требуется или делается, поскольку большая часть памяти в Julia используется для данных, а не для кода.

Котлин [ изменить ]

Основная версия Kotlin предназначена для JVM, основной единицей кода которой является «класс». Каждый класс имеет (и содержит ссылку) загрузчик классов, который загружает его в память по мере необходимости. В большинстве случаев загрузчики классов создаются системой автоматически. Тем не менее, вы можете создать свои собственные классы для динамической загрузки во время выполнения.

Насколько мне известно, явного механизма для выгрузки класса не существует. Однако, когда больше нет ссылок на какой-либо из его классов или на сам загрузчик классов, они станут пригодными для сборки мусора, а память, которую они использовали, будет со временем освобождена сборщиком мусора.

В большинстве случаев этого достаточно, поскольку один из принципов системы заключается в том, что программисту не нужно беспокоиться об управлении памятью.

Тем не менее, могут возникнуть ситуации, когда нужно, чтобы класс был выгружен как можно быстрее, и стратегия решения этой проблемы заключается в создании загрузчика классов, который будет загружать только один класс (или небольшое количество классов) и чтобы затем тщательно управлять созданием ссылок, чтобы вы знали, когда их (или их) безопасно выгрузить. Затем вы можете запросить немедленную сборку мусора, вызвав System.gc(). Однако обратите внимание, что это не гарантирует работу, поскольку запрос может быть отклонен системой, если он будет сочтен несвоевременным.

PARI/GP [ изменить ]

Код PARI можно выгрузить, как и любой другой код C. Но если код находится в форме замыкания (т. е. объекта GEN типа t_CLOSURE ), то его пространство должно быть освобождено с помощью gerepile или перемещения ltop, если он находится в нижней части стека.

В gp это проще -- просто уничтожьте функцию (или установите для нее значение 0, что не совсем то же самое, но также приведет к сбору памяти).

Perl [править]

Perl использует подсчет ссылок как метод управления использованием памяти.Как только последняя ссылка на значение освобождается, это значение может быть уничтожено и освобождено, а затем возвращено в пул памяти. Однако точное время выполнения этого действия не контролируется программистом. Внутри вашей программы, используя undef и delete , вы можете подсказать Perl, что теперь можно освободить эту память. Самое главное, такие действия не следует путать с освобождением памяти обратно операционной системе. В случаях, когда необходимо временно выделить большой объем памяти, делайте это с помощью fork , чтобы при завершении дочернего процесса память действительно освобождалась обратно в систему.

Исправить [ изменить ]

Для скомпилированных программ мало что можно сделать, чтобы освободить пространство сегментов кода, записанных в исполняемый файл PE/ELF, за исключением, возможно, исполняемых файлов "гирляндной цепочки". Вы можете обернуть FreeLibrary/dlcose в соответствии с OpenOneDLL() во встроенные файлы/VM/pcfunc.e.

Однако для интерпретируемых программ код строится и выполняется в динамически выделенной памяти, и фактически "p-test" запускает около 60 отдельных тестовых программ, некоторые из которых преднамеренно интенсивно используют память. Для каждого из них он выделяет полную среду выполнения, включая пространство для кода, стек вызовов и новую кучу, и по завершении удаляет все это и освобождает память. Совершенно очевидно, что этот процесс весьма сложен и не для слабонервных, но вполне выполним.

Питон [ изменить ]

Инструкция del может сделать объекты (как код, так и данные) доступными для повторного использования.

Рэкет [ изменить ]

В Racket есть JIT-компилятор, который транслирует функции в машинный код всякий раз, когда они применяются. Когда такая функция подвергается сборке мусора, машинный код JIT-компиляции высвобождается или повторно используется вместе с ней. Поэтому, чтобы восстановить какой-либо сегмент исполняемого кода, просто удалите ссылки на функцию.

Раку [ редактировать ]

(ранее Perl 6) В общем, не существует специального механизма для своевременного уничтожения объекта, будь то код, данные, переменные, что угодно. Raku выполняет автоматическую сборку мусора для объектов, которые больше не используются. В отличие от Perl, от которого Raku является производным, он не использует подсчет ссылок для отслеживания того, когда память может быть удалена сборщиком мусора, поскольку это, как правило, очень сложно сделать правильно и производительно в многопоточных приложениях. Вместо этого он выполняет «анализ достижимости», чтобы определить, когда объекты могут быть вытеснены из памяти и безопасно удалены.

Объекты Raku могут предоставлять метод "DESTROY", но вы не можете быть уверены, когда (если вообще когда-либо) он будет вызван. Раку, как правило, не очень экономит память. Если нужно иметь много памяти, он с радостью использует ее. Он становится более агрессивным в отношении сохранения, если памяти мало, но обычно память меняет на производительность. Если сборка мусора была запущена, освобожденная память становится доступной для общего пула ОС для любого процесса.

Есть некоторые специфические детали, которые позволят лучше контролировать сборку мусора в особых обстоятельствах, но обычному Raku-программисту не нужно знать о них или иметь с ними дело.

РЕКС [ изменить ]

При использовании REXX в среде (VM) CMS использование NUCXDROP можно использовать для освобождения памяти (виртуального хранилища), которую использует программа REXX (при предварительной загрузке в виртуальную память через NUCXLOAD).

Скала [править]

Тихая болтовня [ изменить ]

Smalltalk запускается в образе, который можно сохранить на диск в виде моментального снимка, а затем загрузить в память и возобновить работу. ВМ (существует несколько реализаций) выполняет сборку мусора на этом образе, а также обычно сжимает его, чтобы ненужную память можно было вернуть в ОС. Цикл моментального снимка-возобновления может выполнять другие виды сжатия, которые еще больше уменьшают размер изображения.

Различные этапы сборки мусора могут быть явно вызваны для немедленного восстановления неиспользуемой памяти, но это не гарантирует, что освобожденная память будет считаться избыточной и, следовательно, будет возвращена ОС.

Tcl [ изменить ]

Tcl может освобождать память, связанную с программой, тремя способами.

Освобождение команд Память, связанная с определенной командой, может быть освобождена обратно в общий пул памяти путем удаления команды. Это делается либо путем создания новой команды с тем же именем, либо с помощью переименования, чтобы изменить имя команды на пустую строку. Освобождение загруженных расширений Память, связанная с загруженным расширением, может быть освобождена с помощью команды unload при условии, что расширение зарегистрировало функцию-обработчик (это относительно редко). После запуска функции обработчика (что дает расширению возможность уничтожить любые команды и другие обратные вызовы, которые оно создало), базовая библиотека будет удалена из памяти с помощью dlclose() (в Unix) или FreeLibrary() (в Windows). Это полностью удаляет соответствующий программный код, а также возвращает другую вспомогательную память в общий пул.Освобождение всего интерпретатора Если интерпретатор не является корневым интерпретатором в своем потоке, вы можете удалить его из интерпретатора-предка, который освобождает всю связанную с ним память обратно в общий пул памяти.

Этот форум перенесен в раздел вопросов и ответов Майкрософт. Посетите Microsoft Q&A, чтобы публиковать новые вопросы.

Вопрос:

Вопрос

Я хочу на время деактивировать мониторинг процессов, а поскольку эта задача выполняется через модуль "secur32.dll", я хочу выгрузить ее из памяти на несколько секунд.

Я искал, какие процессы используют эту dll ИЛИ какой процесс загружает ее в память. Я обнаружил, что процесс «svchost.exe» использует его, поэтому я запускаю следующую команду в командной строке Windows7 (32-разрядная версия):

список задач /m /fi "imagename eq svchost.exe"

и я увидел следующий результат:

Модули имени образа PID
======================== ======== ====== =====================================
svchost.exe 696 ntdll.dll, kernel32.dll, KERNELBASE.dll,
msvcrt.dll, sechost.dll, RPCRT4.dll,
umpnpmgr.dll, SPINF.dll, USER32.dll,
svchost.exe 800 ntdll. dll, kernel32.dll, KERNELBASE.dll,
msvcrt.dll, sechost.dll, RPCRT4.dll,
rpcepmap.dll, RpcRtRemote.dll, secur32.dll,
svchost.exe 936 ntdll.dll, kernel32.dll, KERNELBASE.dll,
msvcrt.dll, sechost.dll, RPCRT4.dll,
ole32.dll, GDI32.dll, USER32.dll, LPK.dll,
/>svchost.exe 1008 ntdll.dll, kernel32.dll, KERNELBASE.dll,
msvcrt.dll, sechost.dll, RPCRT4.dll,
ole32.dll, GDI32.dll, USER32.dll, LPK.dll,
msxml6.dll, secur32.dll, credssp.dll,l,
sfc.dll, sfc_os.DLL
svchost.exe 1048 ntdll.dll, kernel32.dll, KERNELBASE .dll,
msvcrt.dll, sechost.dll, RPCRT4.dll,
ole32.dll, GDI32.dll, USER32.dll, LPK.dll,
USP10.dll, IMM32.DLL , MSCTF.dll,
CRYPTBASE.dll, ADVAPI32.dll, gpsvc.dll,
GPAPI.dll, WLDAP32.dll, Secur32.dll,
svchost.exe 1260 ntdll.dll, kernel32.dll, KERNELBASE.dll, < br />msvcrt.dll, sechost.dll, RPCRT4.dll,
ole32.dll, GDI32.dll, USER32.dll, LPK.dll,
dwmapi.dll, Secur32.dll, SSPICLI.DLL ,
svchost.exe 1344 ntdll.dll, kernel32.dll, KERNELBASE.dll,
msvcrt.dll, sechost.dll, RPCRT4.dll,
ole32.dll, GDI32.dll, USER32 .dll, LPK.dll,
USP10.dll, IMM32.DLL, MSCTF.dll,
secur32.dll, credssp.dll, ssdpapi.dll,
vss_ps.dll, msxml3.dll
svchost.exe 1716 ntdll.dll, kernel32.dll, KERNELBASE.dll,
msvcrt.dll, sechost.dll, RPCRT4.dll,
ole32.dll, GDI32.dll, USER32. dll, LPK.dll,
XmlLite.dll, ssdpsrv.dll, secur32.dll,
SSPICLI.DLL, credssp.dll, fntcache.dll,
ktmw32.dll, ntmarta.dll, WLDAP32.dll
svchost.exe 1772 ntdll.dll, kernel32.dll, KERNELBASE.dll,
AUTHZ.dll, slc.dll, SspiCli.dll, pcwum.dll,
RpcRtRemote.dll , mpssvc.dll,
Fi rewallAPI.dll, VERSION.dll, fwpuclnt.dll,
NSI.dll, CFGMGR32.dll, SHLWAPI.dll,
secur32.dll, credssp.dll, USERENV.dll,
svchost. exe 1924 ntdll.dll, kernel32.dll, KERNELBASE.dll,
msvcrt.dll, sechost.dll, RPCRT4.dll,
apphostsvc.dll, ADVAPI32.dll, IISUTIL.dll,
USER32.dll, GDI32.dll, LPK.dll, USP10.dll,
RpcRtRemote.dll, PROPSYS.dll, mlang.dll
svchost.exe 2352 ntdll.dll, kernel32.dll, KERNELBASE.dll ,
msvcrt.dll, sechost.dll, RPCRT4.dll,
wiaservc.dll, ADVAPI32.dll, USER32.dll,
secur32.dll, SSPICLI.DLL, credssp.dll, < br />svchost.exe 2508 ntdll.dll, kernel32.dll, KERNELBASE.dll,
msvcrt.dll, sechost.dll, RPCRT4.dll,
iisw3adm.dll, ADVAPI32.dll, pcwum.DLL ,
Secur32.dll, SSPICLI.DLL, IMM32.DLL,
MSCTF.dll, IISRES.DLL, CRYPTSP.dll,ll,
svchost.exe 3104 ntdll.dll, kernel32.dll, KERNELBASE.dll,
msvcrt.dll, sechost.dll, RPCRT4.dll,
ipsecsvc.dll, AUTHZ.dll, fwpuclnt.dll,
FirewallAPI.dll, ВЕРСИЯ. dll,
CLBCatQ.DLL, OLEAUT32.dll, secur32.dll,
////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////

Как видите, несколько процессов svchost.exe с PID [800, 936, 1008, 1048, 1260, 1344, 1716, 1772, 2352, 2508, 3104] используют secur32.dll.

Я также выполнил приведенную выше команду в Windows XP (32-разрядная версия) и увидел следующий результат:

Модули имени изображения PID
============================== ======== =====================================
svchost.exe 852 ntdll.dll, kernel32 .dll, ADVAPI32.dll, RPCRT4.dll, ShimEng.dll, AcGenral.DLL,
USER32.dll, GDI32.dll, WINMM.dll, ole32.dll,
msvcrt.dll , OLEAUT32.dll, MSACM32.dll,
svchost.exe 948 ntdll.dll, kernel32.dll, ADVAPI32.dll,
RPCRT4.dll, ShimEng.dll, AcGenral.DLL,
WS2HELP .dll, Secur32.dll, xpsp2res.dll,
CLBCATQ.DLL, COMRes.dll
svchost.exe 1064 ntdll.dll, kernel32.dll, ADVAPI32.dll,
RPCRT4.dll, ShimEng.dll, AcGenral.DLL,
USER32.dll, GDI32.dll, WINMM.dll, ole32.dll,
msvcrt.dll, OLEAUT32.dll, MSACM32.dll,
svchost.exe 1212 ntdll.dll, kernel32.dll, ADVAPI32.dll,
RPCRT4.dll, ShimEng.dll, AcGenral.DLL,
USER32.dll, GDI32. dll, WINMM.dll, ole32.dll,
msvcrt.dll, OLEAUT32.dll, MSACM32.dll,
svchost.exe 1328 ntdll.dll, kernel32.dll, ADVAPI32.dll,
RPCRT4.dll, ShimEng.dll, AcGenral.DLL,

В приведенном выше списке процессы с PID [852, 948, 1064, 1328] используют модуль secur32.dll.

Теперь мой вопрос:

Как я должен выгрузить эту dll на некоторое время, а затем быстро загрузить ее в память, чтобы предотвратить СБОЙ СИСТЕМЫ?
Я имею в виду, как получить дескриптор резидентной dll (здесь есть secur32.dll!), чтобы выгрузить ее из памяти?

Я предполагаю, что сначала нужно получить дескриптор процесса svchost.exe (конечно, я не знаю, с каким PID!), а затем использовать этот дескриптор для получения дескриптора secure32.dll.
Затем передайте дескриптор dll функции unloadlibrary, подождите несколько миллисекунд, а затем снова загрузите dll в адресное пространство процесса svchost.exe, чтобы предотвратить сбой системы.

Но я не знаю, какие функции Windows следует использовать для реализации этих шагов?
Или у вас есть другое и лучшее решение для этой цели?

В VB 6, когда программа запущена и пользователь щелкает X в форме, чтобы закрыть программу. Как удалить программу из памяти? Когда это происходит сейчас, мне нужно перейти в Диспетчер задач и Завершить задачу, чтобы закрыть программу.

Все комментарии

Как выгрузить программу

от lexingtonit · около 20 лет, 5 месяцев назад

Private Sub Form_Unload(Cancel As Integer)
End
End Sub

Как выгрузить программу

от dennisbv · около 20 лет, 5 месяцев назад

Автор оценил этот ответ

Как выгрузить программу

от dennisbv · около 20 лет, 5 месяцев назад

Этот вопрос был закрыт автором

Начать или найти

Связанные обсуждения

Powershell -CodeSigningCert не работает

от JB_Beta · около 3 дней, 6 часов назад

Украденный мобильный телефон — есть MAC-адрес

от nmcmeechan2003 · около 3 дней, 9 часов назад

Как отобразить пост и страницы моего веб-сайта на моей странице в Facebook?

от wairskhan8733 · около 2 недель, 1 день назад

Предложения по поиску по веб-сайту

от ccorinthos · около 2 недель, 3 дня назад

Использование Office 2010

от davidmarks57 · около 2 недель, 6 дней назад

Похожие форумы

    · 43 654 обсуждения · 113 обсуждений · 11 783 обсуждения · 1 241 обсуждение · 404 обсуждения

Премиум TechRepublic

Как нанять финтех-инженера

Этот набор для найма от TechRepublic Premium содержит описание работы, примеры вопросов для собеседования и основное объявление о поиске, которое поможет вам найти, провести собеседование, нанять и нанять лучших кандидатов на открытую вакансию FinTech Engineer. Из предисловия к комплекту для найма: За последнее десятилетие или около того, особенно после повсеместного распространения смартфонов в домене .

Опубликовано: 17 марта 2022 г., 17:00 по тихоокеанскому времени. Изменено: 23 марта 2022 г., 20:00 по тихоокеанскому времени.

Комплект для найма: Дизайнер виртуальной реальности

Этот набор для найма от TechRepublic Premium содержит описание работы, примеры вопросов для собеседования и базовое объявление о поиске, которое поможет вам найти, провести собеседование, нанять и нанять лучших кандидатов на открытую вакансию дизайнера виртуальной реальности. Из введения к набору для найма: хотя концепция приложений виртуальной и дополненной реальности существует уже несколько десятилетий, .

Опубликовано: 10 марта 2022 г., 16:00 по тихоокеанскому времени. Изменено: 12 марта 2022 г., 12:00 по тихоокеанскому стандартному времени.

Контрольный список: развертывание приложений и служб Microsoft 365 на компьютерах Mac

Очень важно правильно спланировать развертывание приложений и служб Microsoft 365 на компьютерах Mac, чтобы не раздражать конечных пользователей. Необходимо учитывать так много элементов, что дальновидным ИТ-специалистам следует рассмотреть возможность использования контрольного списка. При правильном администрировании ИТ-отделы могут гарантировать, что важные задачи не будут упущены из виду, а пользователям не нужно возвращать системы в службу поддержки.

Опубликовано: 23 февраля 2022 г., 16:00 по тихоокеанскому времени. Изменено: 24 февраля 2022 г., 21:00 по тихоокеанскому стандартному времени. Подробнее Подробнее Подробнее TechRepublic Premium

Исследование: сложности развертывания мультиоблачных сред часто оправдывают преимущества, даже в непростые времена

Результаты последнего опроса TechRepublic Premium показывают, что предприятия продолжают развертывать мультиоблачные решения, но ИТ-специалисты, которые их поддерживают, не знают, как они изменятся в будущем. Из введения: На пороге третьего года глобальной пандемии COVID-19 отрасли, предприятия, потребители и поддерживающие их специалисты в области информационных технологий .

Опубликовано: 17 февраля 2022 г., 16:00 по тихоокеанскому времени. Изменено: 19 февраля 2022 г., 5:00 по тихоокеанскому стандартному времени. Подробнее Подробнее Подробнее TechRepublic Premium

За период продолжительного использования компьютера вы установите множество программ и сохраните множество файлов. Они будут разбросаны по всему жесткому диску вашего компьютера и будут занимать все больше и больше места. Когда жесткий диск заполнится, ваш компьютер предложит вам удалить содержимое, чтобы освободить место в памяти. Пока вы этого не сделаете, у вас может не хватить места для хранения ваших бизнес-файлов, или вы обнаружите, что не можете завершить работу, потому что ваш компьютер работает слишком медленно. Вы можете освободить место, удалив ненужные файлы и программы и запустив утилиту очистки диска Windows.

Удалить большие файлы

Нажмите кнопку "Пуск" Windows и выберите "Документы".

Нажмите направленную вниз стрелку "Дополнительные параметры" в правом верхнем углу окна. Выберите представление «Список». Это позволяет просматривать информацию о ваших файлах, включая размер файла.

Нажмите на столбец "Размер", чтобы упорядочить файлы по размеру. Это сначала отображает самые большие файлы и дает вам представление о том, какие файлы занимают больше всего места на вашем компьютере. Например, такие файлы, как музыка и видео, обычно больше, чем изображения или текстовые документы.

Щелкните правой кнопкой мыши большие файлы, которые вам больше не нужны, и выберите "Удалить" в контекстном меню, чтобы удалить их с вашего компьютера.

Удалить неиспользуемые программы

Нажмите кнопку "Пуск" в Windows и выберите "Панель управления".

Нажмите «Удалить программу» в разделе «Программы», чтобы просмотреть установленные программы на вашем компьютере.

Нажмите на столбец «Размер», чтобы упорядочить программы в зависимости от размера программы. Это позволяет определить, какие программы занимают больше всего места.

Нажмите на название программы, которая вам больше не нужна, и нажмите «Удалить», чтобы удалить программу.

Повторите это для каждой программы, которую хотите удалить.

Использовать очистку диска

Нажмите кнопку "Пуск" в Windows и введите "очистка диска" в поле поиска.

Нажмите «Очистка диска» в результатах поиска, чтобы запустить приложение.

Если у вас более одного жесткого диска, вас спросят, какой диск вы хотите очистить. Выберите диск и нажмите "ОК".

Поставьте галочку рядом с типами файлов, которые вы хотите удалить.

Нажмите «ОК», а затем нажмите «Удалить файлы», чтобы подтвердить свое решение. Программа очистки диска удалит указанные файлы с жесткого диска вашего компьютера.

Читайте также: