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

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

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

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

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

Закрывать ли (выгружать) приложения на iPhone и iPad из панели многозадачности? | Яблык

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

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

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

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

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

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

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

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

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

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

Java

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

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

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

Бесплатная память на IPHONE Бесконечное хранение фото в iCloud на айфоне. Бесконечная память

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

Основная версия 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 Qsecur32.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, 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, 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 месяцев назад

Источник: kompyuter-gid.ru

Выгрузка резидентной программы из памяти

Чтобы выгрузить резидентную программу из памяти, необходимо сделать три вещи: закрыть открытые программой файлы и устройства, восстановить все перехваченные векторы прерываний, и наконец, освободить всю занятую программой память. Трудность может вызвать второй шаг, так как после нашего резидента могли быть загружены другие программы, перехватившие те же прерывания.

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

Поэтому, если хоть один вектор прерывания не указывает на наш обработчик, выгружать резидентную программу нельзя. Это всегда было главным вопросом, и спецификации AMIS и IBM ISP (см. ) являются возможным решением этой проблемы. Если вектор прерывания не указывает на нас, имеет смысл проверить, не указывает ли он на ISP-блок (первые два байта должны быть EBh 10h, а байты 6 и 7 — «K» и «B»), и, если это так, взять в качестве вектора значение из этого блока и т.д. Кроме того, программы могут изменять порядок, в котором обработчики одного и того же прерывания вызывают друг друга.

Последний шаг в выгрузке программы — освобождение памяти — можно выполнить вручную, вызывая функцию DOS 49h на каждый блок памяти, который программа выделяла через функцию 48h, на блок с окружением DOS, если он не освобождался при загрузке, и наконец, на саму программу. Однако есть способ заставить DOS сделать все это (а также закрыть открытые файлы и вернуть код возврата) автоматически, вызвав функцию 4Ch, объявив резидент текущим процессом. Посмотрим, как это делается на примере резидентной программы, занимающей много места в памяти. Кроме того, этот пример реализует все приемы, использующиеся для вызова функций DOS из обработчиков аппаратных прерываний, о которых рассказано в .

; scrgrb.asm ; Резидентная программа, сохраняющая изображение с экрана в файл. ; Поддерживается только видеорежим 13h (320x200x256) и только один файл.

Fore kc .ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий

Источник: www.maple9.ru

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

Здравствуйте. Как выгрузить программу из памяти при закрытии окна? При нажатии на кнопку закрытия окна программа остается висеть в памяти.

Отслеживать
задан 25 фев 2012 в 17:48
383 3 3 золотых знака 12 12 серебряных знаков 45 45 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Чтобы приложение полностью закрылось после закрытия окна,

  • на окна должно указывать свойство Application.MainWindow ,
  • свойство Application.ShutdownMode должно быть равным OnMainWindowClose .

Кроме того, можно явно закрыть приложение в требуемом месте

Application.Current.Shutdown();
Отслеживать
ответ дан 26 фев 2012 в 8:34
34.3k 25 25 золотых знаков 95 95 серебряных знаков 213 213 бронзовых знаков

Если точнее, то не

Application.ShutdownMode = ShutdownMode.OnMainWindowClose;
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
Отслеживать
ответ дан 29 мар 2012 в 7:55
376 1 1 серебряный знак 8 8 бронзовых знаков

  • c#
  • wpf
    Важное на Мете

Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник: ru.stackoverflow.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru