Удалить объект из памяти java

Обновлено: 02.07.2024

Я хочу удалить созданный мной объект (овал, который следует за вами), но как мне это сделать?

Хорошо, я дам еще немного контекста. Я делаю небольшую игру с овалом, которым вы можете управлять, и овалом, который следует за вами. Теперь у меня есть файлы с именами: DrawPanel.class, этот класс рисует все на экране и обрабатывает столкновения, звуки и т. Д. У меня есть own.class, который представляет собой овал, следующий за игроком. У меня есть entity.class, которым вы можете управлять. И если игрок пересекается с последователем, я хочу, чтобы мой объект игрока был удален. Как я это делаю:

В Java нет удаления объектов. Но обычно в этом нет необходимости: вам нужно убедиться, что на экране больше ничего не отображается (если это то, что делает «слежение за вами»). Возможно, вы хотите попробовать заставить сборщик мусора удалить объект? есть вопрос об этом здесь уже. Или, может быть, вы пробуете что-то еще? вы можете попробовать прочитать немного о сборщике мусора здесь или здесь. Если это все еще не поможет, вам нужно будет уточнить детали. Если вы действительно действительно хотите обрабатывать выделение объектов вручную, используйте JNI: создайте библиотеку C / C ++, которая используется из кода Java, но делает все (создает, удаляет и т. Д.) Самостоятельно, но внутри вашей библиотеки у вас есть C / Код на C ++, без Java. Я не видел способа удалить объект Java вручную. Если ваш профилировщик сообщает вам о наличии проблем, эти проблемы часто возникают из-за «забытых» ссылок на объекты. В вашем случае, похоже, нигде нет проблем.

Вы должны удалить ссылки на него, присвоив null или оставив блок, в котором он был объявлен. После этого он будет автоматически удален сборщиком мусора (не сразу, а со временем).

Не то, что вы сейчас ищете, но к вашему сведению: вы можете вызвать сборщик мусора с помощью вызова System.gc ()

Вызов вручную, System.gc() как правило, не является хорошей идеей , поскольку на самом деле он может игнорироваться JVM. Не очень хорошая идея, но вы также можете вызвать его аналогично System .. Runtime.getRuntime (). Gc (). Дополнительная информация: процедуры сборки мусора, предоставляемые Java, являются членами класса Runtime. Класс Runtime - это специальный класс, который имеет один объект (Singleton) для каждой основной программы. Объект Runtime предоставляет механизм для прямой связи с виртуальной машиной. Чтобы получить экземпляр Runtime, вы можете использовать метод Runtime.getRuntime (), который возвращает Singleton. Поэтому я должен сделать все мои текстовые представления и кнопки изображений нулевыми в параметре onPause ? Нет никакой гарантии, что сборщик мусора когда-либо запустится или что, если это произойдет, он соберет (а не «удалит») какой-либо конкретный объект.

Ваш C ++ показывает.

Здесь нет delete java нет, и все объекты создаются в куче. В JVM есть сборщик мусора, который полагается на счетчики ссылок.

Как только на объект больше нет ссылок, он становится доступным для сбора сборщиком мусора.

myObject = null не может этого делать; например:

Все это устанавливает ссылку myObject на null, это не влияет на объект, на который myObject когда-то указали, за исключением простого уменьшения счетчика ссылок на 1. Поскольку myOtherObject все еще ссылается на этот объект, он еще не доступен для сбора.

У меня есть класс с именем Point , как показано ниже:

У меня есть объект из этого класса с именем p , как показано ниже:

Я хочу удалить этот объект, я искал, как это сделать, единственное решение, которое я нашел, было:

Но метод финализации Point не работал после того, как я это сделал. Что я могу делать?

После того, как вы сделаете p = null; , последняя ссылка на вашу точку будет удалена, и сборщик мусора теперь собирает экземпляр, потому что на этот экземпляр нет ссылки. Если вы вызовете System.gc(); , сборщик мусора переработает неиспользуемые объекты и вызовет методы finalize этих объектов.

Вывод: One point has been destroyed.

Вы не можете удалить объект в java, это работа GC (сборщика мусора), который находит и удаляет переменные экземпляра, на которые нет ссылки. Это означает, что переменные, на которые больше не указывают и на которые не ссылаются, а это значит, что теперь у них нет возможности вызвать их. Следовательно, когда вы делаете это p = null; , вы присваиваете нуль ссылочной переменной, содержащей ссылку на объект Point . Следовательно, теперь объект Point, на который указывает p , является сборщиком мусора.

Но нет гарантии вызова метода finalize() , так как GC не гарантированно запускается в определенное время (детерминированное время).

Объект МОЖЕТ БЫТЬ УНИЧТОЖЕН, если на этот объект не осталось указателя.

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

На самом деле p = null приведет только к потере ссылки на объект в куче java. Но Объект P все еще активен. Если вы используете System.gc (), вы сможете очистить все активные объекты, включая ссылку на них в куче java. Итак, я рекомендую использовать System.gc () после выполнения p = null

В java нет такого понятия, как «удалить объект». Сборщик мусора автоматически удаляет объекты, когда обнаруживает, что на них нет ссылки. Сборщик мусора также автоматически вызывает метод finalize() перед окончательным удалением объекта из памяти. Вы не можете контролировать, когда это произойдет.

Вам не нужно уничтожать объект, сборщик мусора сделает это за вас.

GC восстанавливает объект, когда объект, на который больше нет ссылок, становится кандидатом, на который можно претендовать. Для базового приложения нельзя быть уверенным, что сборщик мусора работает в течение срока службы процесса. Итак, вот небольшой пример теории тестирования:

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


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

Способы создания объекта Java

Чтобы создать объект, используют ключевое слово new. Вы его наверняка помните по созданию массивов, которые в Java тоже являются объектами. После new указывают тип создаваемого объекта, т.е. класс. В Java, как и в других ООП-языках, можно использовать встроенные классы и определять пользовательские.

Класс — это шаблон, по которому создаётся экземпляр — объект. Класс определяет свойства и поведение будущего объекта. Команда «Изготовь шестигранную гайку» имеет смысл, только если исполнитель понимает, что такое гайка. Именно класс описывает свойства «гайки» и указывает, что с ней можно делать.

Допустим, у нас есть класс Item («предмет»), где прописано, что каждый предмет имеет габариты и свойство moveable, которое определяет, можно ли предмет двигать:

Чтобы создать экземпляр toolbox («ящик с инструментами») класса Item, заведём переменную для хранения ссылки на объект, а затем запустим конструктор:

При создании ящика мы переопределили его параметры. Если бы нас устраивали значения по умолчанию, мы создали бы ящик без параметров:

Динамическое создание объектов Java

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

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

В Джаве нет деструктора в привычном понимании. Есть метод finalize — он вызывается, когда за объектом приходит сборщик мусора. Но есть у этого метода особенности, из-за которых его редко используют на практике:

  • неизвестно, в какой момент он будет вызван и будет ли вызван вообще — программа может завершиться раньше;
  • он замедляет работу сборщика мусора с объектом более чем в 400 раз;
  • объекты утилизируются не сразу, а попадают в очередь на финализацию и продолжают занимать память неопределённое время.

Зачем же этот метод существует в языке?

  • Для составления «описи» объектов, которые не используются, но и не удалены — через поиск и логирование.
  • Для высвобождения ресурсов при работе с нативным кодом: например, С.

Более толковый помощник в борьбе за свободные ресурсы — интерфейс AutoCloseable — позволяет закрывать потоки, файлы, соединения с БД и др. Чтобы воспользоваться интерфейсом, нужно реализовать его единственный метод, сlose(), в классе, объекты которого вы планируете закрывать:

Вызвать метод можно в конструкции try-с-ресурсами:

Открыли ресурс, запустили выполнение задачи, завершили выполнение, закрыли ресурс.

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

Есть метод у объекта,которые проверяет вылет за пределы,и если вылетел то должен этот объект удаляться.
Я в java недавно,но явных деструкторов как понял нету.Нашёл про finalize,и написал соответсвующий код

Но объект всё равно не удаляется. Понял это по тому что ссылка на объект по прежнему остаётся не null.
Так как удалить объект в его же методе,в finalize дописать что-то надо? __________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Удаление объекта
У каждого класса есть метод который удаляет определенный объект. deleteObject(Car car).


Удаление объекта из массива объектов
Здравствуйте. Вопрос вот в чем: есть массив объектов некоторого класса в ArrayList. В определенный.

Удаление объекта при столкновении - ConcurrentModificationException
Выскакивает эта проклятая ошибка. Пытаюсь с помощью итератора пробежаться по коллекции и, если.

Почитал почитал.
В итоге вопрос,а можно ли обратить в классе к ссылке на него же.
То есть например есть объект
Object s = new Object;
а в классе метод Чек,и можно так написать что бы он удалял ссылку на самого себя
что то типо this == null; и ссылка s занулится? Justix, на сколько я знаю нет, да и бросьте вы это занятие с удалением объектов, за вас это gc сделает Так он сделает после закрытия программы наверное.А пока она не закроет,этих объектов станет куча и следовательно производительность упадётОо
Ну я наверное сделаю проверку тогда не в этом классе а в другом где они и вызываются.

Добавлено через 2 минуты
может замечали, когда при работе с java-приложением, оно так резко начинает работать шустрее, как-будто открылось второе дыхание, так вот в этот момент gc почистил мусор

А пока она не закроет,этих объектов станет куча и следовательно производительность упадётОо

Вы бы чтоб не гадать почитали чтоли про типы ссылок Hard, Soft, Weak и Phantom, а потом про то когда объекты становятся доступны для сборщика мусора (видимость ссылки в статическом контексте и тд).
И тогда вам не придётся делать наверное, сможете наверняка

ещё добавлю: представьте себе что в методе finalize(); произошло исключение - угадайте будет удалён объект или нет?

ещё добавлю: представьте себе что в методе finalize(); произошло исключение - угадайте будет удалён объект или нет?

Заставило задуматься секунд на 5. Будет.

Добавлено через 1 минуту

И забудьте. Надолго. finalize можно использовать только ОЧЕНЬ хорошо понимая, что Вы делаете. У Вас он не делает ничего, кроме как сильно замедляет скорость сборки мусора.

Обнуляйте ссылки на объекты, остальное сделает JVM.

нет не будет, так как этот метод вызывается 1 раз прямо перед удалением и если он фейлится, то объект зависает

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


cheremin,17 августа 2012 в 21:05
Если вы внимательно прочитаете комментарии к той статье, вы найдете там разоблачение черной магии: нет никаких утечек, просто выполнение чего-то, достаточно тяжелого в finalize() задерживает очередь финализации, и GC просто не успевает угнаться за аллокацией в быстром цикле. Если основной цикл аллокации чуть затормозить — все освобождается.

Добавлено через 19 минут
Ну вот накидал я простейший тестик.

Каждый экземпляр тащит за собой 1Мб памяти (твердая ссылка). В finalize гарантированно кидается исключение.

Если бы экземпляр при этом зависал - после непродолжительной работы мы имели бы ООМ. Я дожидался 300000 экземпляров. Т.е. это 300Гб памяти. При стандартном выделении и всего 8Г на машине.

Кстати, интересно посмотреть на то, как выводился счетчик. + 600-700 - пауза. Еще + 600-700 - пауза. Имхо, паузы - это GC. Раз в секунду у меня где-то.

Может, я чего не понимаю и ссылки на byte[] как-то собираются, а сами объекты остаются в памяти. Что-то мне кажется, что это менее вероятно, чем сбор объектов целиком.

Добавлено через 8 минут
Подсоединился к тесту через VisualVM - никаких признаков OOM. Классы не накапливаются, память освобождается.

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