Удалить переменную из памяти
Я искал точный ответ на этот вопрос уже пару дней, но ничего хорошего не получил. Я не новичок в программировании, но пока еще не на среднем уровне.
Когда я нахожусь в оболочке Python, я набираю: dir() и вижу все имена всех объектов в текущей области (основной блок), их 6:
Затем, когда я объявляю переменную, например, x = 10 , она автоматически добавляет в эти списки объектов встроенный модуль dir() , а когда я снова печатаю dir() , она показывает сейчас:
То же самое касается функций, классов и так далее.
Как удалить все эти новые объекты, не стирая стандарт 6, который был доступен в начале?
Я читал здесь о «очистке памяти», «очистке консоли», которая стирает весь текст из окна командной строки:
Но все это не имеет ничего общего с тем, чего я пытаюсь достичь, оно не очищает все используемые объекты.
Вы можете удалить отдельные имена с помощью del :
Или вы можете удалить их из объекта globals() :
Это просто пример цикла; он защищает только те имена, которые не начинаются с подчеркивания, и делает (не безосновательно) предположение, что вы использовали имена без подчеркивания в начале в вашем интерпретаторе. Вместо этого вы можете использовать жестко запрограммированный список имен (белый список), если вы действительно хотите быть тщательным. Для очистки нет встроенной функции, кроме выхода и перезапуска интерпретатора.
Импортированные вами модули ( import os ) останутся импортированными, поскольку на них ссылается sys.modules ; последующий импорт будет повторно использовать уже импортированный объект модуля. Вы просто не будете иметь ссылку на них в своем текущем глобальном пространстве имен.
На самом деле python возвращает память, которая больше не используется. Это называется сборка мусора , которая является автоматическим процессом в python. Но все же, если вы хотите сделать это, вы можете удалить его с помощью del variable_name . Вы также можете сделать это, назначив переменную None
Единственный способ по-настоящему восстановить память из не связанных объектов Python - через сборщик мусора. Ключевое слово del просто отменяет привязку имени к объекту, но объект все еще нуждается в сборке мусора. Вы можете принудительно запустить сборщик мусора с помощью модуля gc, но это почти наверняка преждевременная оптимизация, но она имеет свои риски. Использование del не имеет никакого реального эффекта, так как эти имена были бы удалены, так как они все равно вышли из области видимости.
Переменная не удаляется. И мне дважды выводит "100". В консоли чисто.
Я как-то не так пытаюсь удалить переменную?
Помощь в написании контрольных, курсовых и дипломных работ здесь
Объявление строчной переменной в JavaScript
Начал осваиваться в JavaScript!И возникла проблема с преобразованием типов в проверке с условием.
Глобальные переменные,их объявление и удаление
Здравствуйте, читая учебники по javascript у меня назрели пара вопросов,ответы на которые там я и.
объявление переменной
Всем привет, помогите кто может. Не понимаю почему alert выводит undefined.
Удаление переменной и объявление ее вновь
Здравствуйте. В проект подключаю библиотеку, но сама библиотека с изъяном, на форуме ей посвящённой.
delete удаляет запись из объекта/массива или сам объект XRoy,
хорошо, в таком случае как мне удалить переменную?
или просто обнулять их?
Mothur,
Зачем?
Когда не останется ссылок на переменную, GC сам удалит ее
XRoy, kalabuni,
Я просто не знаю куда думать. У меня куда-то почему-то утекает ОЗУ.
НА странице selet. Значения в атрибуте title содержат данные об оплате (пока что так для удобства и тестирования). При выборе я получаю эти данные, провожу вычисления. Если меньше нуля - алерт. Иначе - запрос аяксом к бд и вывод в другой селект сопутствующих данных.
Особенно много памяти уходит при алерте. Вкладка за кликов 10 по селеку может жрать окло 1гб ОЗУ!
Отслеживаю выбор значения в селекте
Функция aj - моя функция для аякс запроса.
И убрал везде все var. Переменную просто называю и пишу значение.
Память всё равно уходит.
Добавлено через 12 минут
kalabuni,
спасибо.
буду разбираться. Вопрос с переменными решён.
Переменная становится не настраиваемым свойством глобального объекта, т. е. её нельзя удалить.
C++ поддерживает динамическое выделение и освобождение объектов с помощью new операторов и delete . Эти операторы выделяют память для объектов из пула, называемого свободным хранилищем. new Оператор вызывает специальную функцию operator new , и delete оператор вызывает специальную функцию operator delete .
new Функция в стандартной библиотеке c++ поддерживает поведение, заданное в стандарте c++, что вызывает std::bad_alloc исключение в случае сбоя выделения памяти. Если вы по-прежнему хотите использовать не вызывающую версию new , свяжите программу с nothrownew.obj . Однако при компоновке с параметр nothrownew.obj по умолчанию operator new в стандартной библиотеке C++ больше не работает.
Список файлов библиотеки в библиотеке времени выполнения C и стандартной библиотеке C++ см. в разделе функции библиотеки CRT.
new Оператор
Компилятор преобразует инструкцию, такую как this, в вызов функции operator new :
Если запрос имеет нулевые байты хранилища, функция operator new возвращает указатель на отдельный объект. То есть повторные вызовы operator new возвращают разные указатели. Если недостаточно памяти для запроса на выделение, operator new создает std::bad_alloc исключение. Или возвращает, nullptr Если вы связались с поддержкой без вызова operator new .
Можно написать подпрограммы, которая пытается освободить память и повторить выделение памяти. Дополнительные сведения см. на веб-сайте _set_new_handler . Дополнительные сведения о схеме восстановления см. в разделе Обработка нехватки памяти .
operator new В следующей таблице описаны две области для функций.
Область действия для operator new функций
Оператор | Область |
---|---|
::operator new | Глобальный |
имя класса** ::operator new ** | Класс |
Первый аргумент для operator new должен иметь тип size_t , определенный в <stddef.h> , а тип возвращаемого значения — Always void* .
Глобальная operator new функция вызывается, когда new оператор используется для выделения объектов встроенных типов, объектов типа класса, которые не содержат определяемых пользователем operator new функций, и массивов любого типа. Если new оператор используется для выделения объектов типа класса, в котором operator new определен объект, operator new вызывается этот класс.
operator new Функция, определенная для класса, является статической функцией-членом (которая не может быть виртуальной), которая скрывает глобальную operator new функцию для объектов этого типа класса. Рассмотрим случай, когда new используется для выделения и установки памяти для заданного значения:
Аргумент, заданный в круглых скобках, new передается в Blanks::operator new качестве chInit аргумента. Однако глобальная operator new функция скрыта, что приводит к формированию ошибки следующим кодом:
Компилятор поддерживает массив new и операторы-члены delete в объявлении класса. Пример:
Обработка нехватки памяти
Тестирование на неудачное выделение памяти можно выполнить, как показано ниже.
Существует другой способ обработки запросов на выделение памяти, завершившихся сбоем. Напишите пользовательскую подсистему восстановления для решения такой ошибки, а затем зарегистрируйте функцию, вызвав _set_new_handler функцию времени выполнения.
delete Оператор
Память, выделенная динамически с помощью new оператора, может быть освобождена с помощью delete оператора. Оператор delete вызывает operator delete функцию, которая освобождает память в доступном пуле. Использование delete оператора также приводит к вызову деструктора класса (если он существует).
Существует глобальная функция и функции уровня класса operator delete . operator delete Для данного класса может быть определена только одна функция. Если она определена, то она скрывает глобальную operator delete функцию. Глобальная operator delete функция всегда вызывается для массивов любого типа.
Глобальная operator delete функция. Для глобальных operator delete функций и членов класса существуют две формы operator delete :
Для данного класса может присутствовать только одна из двух предыдущих форм. Первая форма принимает один аргумент типа void * , который содержит указатель на объект, который необходимо освободить. Вторая форма, размер освобождения, принимает два аргумента: первый — указатель на блок памяти для освобождения, а второй — число байтов для освобождения. Тип возвращаемого значения обеих форм — void ( operator delete не может возвращать значение).
Цель второй формы — ускорить поиск нужной категории размера объекта для удаления. Эти сведения часто не хранятся рядом с самим выделением и, скорее всего, не кэшируются. Вторая форма полезна, когда operator delete функция из базового класса используется для удаления объекта производного класса.
operator delete Функция является статической, поэтому она не может быть виртуальной. operator delete Функция подчиняется контролю доступа, как описано в разделе Управление доступом к членам.
В следующем примере показаны определяемые пользователем operator new функции и, operator delete предназначенные для записи в журнал выделений и освобождений памяти:
Приведенный выше код можно использовать для обнаружения "утечки памяти", то есть памяти, выделенной в бесплатном хранилище, но не освобожденной. Чтобы обнаружить утечки, глобальные new операторы и delete переопределяются для подсчета выделения и освобождения памяти.
Компилятор поддерживает массив new и операторы-члены delete в объявлении класса. Пример:
Аргумент Cast-Expression должен быть указателем на блок памяти, выделенный ранее для объекта, созданного с помощью оператора New. delete Оператор имеет результат типа void и поэтому не возвращает значение. Пример:
Использование delete в указателе на объект, не выделенный с помощью, new дает непредсказуемые результаты. Однако можно использовать delete для указателя со значением 0. Такая инициализация означает, что если new в случае сбоя возвращается значение 0, Удаление результата неудачной new операции является безвредным. Дополнительные сведения см. в разделе операторы new и DELETE.
new Операторы и delete можно также использовать для встроенных типов, включая массивы. Если pointer ссылается на массив, поместите пустые скобки ( [] ) перед pointer :
Использование delete оператора для объекта освобождает его память. Программа, которая разыменовывает указатель после удаления объекта, может создать непрогнозируемый результат или вызвать сбой.
Если delete используется для освобождения памяти для объекта класса C++, деструктор объекта вызывается до освобождения памяти объекта (если у объекта есть деструктор).
Если операнд delete оператора является изменяемым l-значением, его значение не определено после удаления объекта.
Если указан параметр компилятора /SDL (включить дополнительные проверки безопасности) , операнду оператора присваивается delete недопустимое значение после удаления объекта.
Использование оператора delete
Существует два синтаксических варианта для оператора delete: один для единичных объектов, а другой для массивов объектов. В следующем фрагменте кода показано, как они отличаются:
Следующие два варианта приводят к неопределенным результатам: использование формы массива delete ( delete [] ) для объекта и использование немассивного класса DELETE в массиве.
Пример
Примеры использования см delete . в разделе оператор New.
Принцип работы delete
Оператор delete вызывает оператор функции Delete.
Для объектов, не имеющих тип класса (класс, Структураили объединение), вызывается оператор глобального удаления. Для объектов типа класса имя функции освобождения разрешается в глобальной области, если выражение delete начинается с оператора унарного разрешения области ( :: ). В противном случае перед освобождением памяти оператор удаления вызывает деструктор объекта (если указатель не имеет значения null). Оператор удаления можно определять отдельно для каждого класса; если для некоторого класса такое определение отсутствует, вызывается глобальный оператор удаления. Если выражение удаления используется для освобождения объекта класса, статический тип которого имеет виртуальный деструктор, функция освобождение разрешается через виртуальный деструктор динамического типа объекта.
Вы не должны использовать класс Files.readAllBytes при преобразовании файла в байты. После использования другого байтового преобразователя. Основная проблема заключается в том, что байтовый массив в переменной не может быть удален из памяти.
Я понял, что это была ситуация.
Как мы можем очистить это от памяти? Существовали методы динамического выделения памяти на языке Си (Malloc), эта память не удаляется в Java.
2 ответа
В Java массивы являются объектами. Java-сборщик мусора в конечном итоге позаботится о них и освободит память, связанную с объектами, на которые нет ссылок.
Вы можете легко проверить это следующим образом:
Вывод (абсолютные значения будут отличаться в вашей среде):
Как вы можете видеть, явный запуск сборки мусора освобождает ресурсы, связанные с байтовым массивом 4 МБ. Теперь, обычно, это не требуется и не является производительным / эффективным для явного запуска сборщика мусора (и на самом деле нет никакой гарантии, что это вызовет сборку). В примере это сделано в иллюстративных целях.
Сборка мусора выполняется в фоновом режиме, JVM планирует его так, как считает нужным. Одна из стратегий - запускать полную коллекцию всякий раз, когда пространство кучи (почти) исчерпано. Вещи сложнее, потому что разные виды куч обычно существуют для разных поколений объектов (например, новые объекты против старых объектов).
Самое важное, что вы можете сделать, это не хранить ссылки на неиспользуемые объекты. В конечном итоге эти объекты, на которые нет ссылок, будут собраны, а связанная память будет использована повторно.
Основная проблема заключается в том, что байтовый массив в переменной не может быть удален из памяти.
Нет, это не проблема.
Все, что вам нужно сделать, - это организовать недоступность байтового массива, присвоив null переменной . и любой другой достижимой переменной, которая все еще содержит ссылку на массив.
Об этом позаботится сборщик мусора (GC).
Вам не нужно звонить System.gc() . GC будет работать, когда он должен работать. Если вы попытаетесь вмешаться, вы, вероятно, только сделаете свой код неэффективным.
Настоящая проблема заключается в одном из следующих:
Файл слишком большой для чтения в память; то есть такой большой, что вы получаете OOME. Если это так, то решение заключается в потоковой передаче файла вместо использования readAllBytes .
Вы одержимы чрезмерным использованием памяти. Память дешевая. Время программиста дорого.
Если вам действительно нужно , чтобы минимизировать использование памяти вашим приложением, вы используете неправильный язык программирования. Java не предназначена для этого стиля программирования. Java и сборщики мусора Java спроектированы так, чтобы быть эффективными в тех случаях, когда сборщик мусора запускается нечасто и имеется много свободной памяти для хранения мусора между коллекциями. Если вы попытаетесь бороться с этим, ваше приложение может тратить много времени на восстановление небольших объемов памяти.
Обратите внимание, что даже если Java GC действительно собирает ваш недоступный байтовый массив (почти) сразу, он, вероятно, не вернет исправленную память операционной системе. Таким образом, объем памяти вашего приложения не уменьшится. Таким образом, вы, скорее всего, не получите никакой реальной выгоды от явного вызова System.gc() .
Если вам действительно нужно , чтобы минимизировать использование памяти, используйте C или C ++
Если вам действительно нужно явно удалять объекты, используйте C или C ++
Читайте также: