2013-09-21 3 views
2

На некоторых языках, таких как Python, есть способы, по которым мы можем «удалить» объект из кучи явно. Как, например:Возможно ли удаление вручную объекта в Java?

s = "This is a Test" 
del s 

Теперь объект s не может больше использоваться. Теперь, мой вопрос, можем ли мы сделать что-нибудь подобное в Java? Да, я знаю, что это сбор мусора, и это огромное преимущество в большинстве ситуаций, но что, если я хочу вручную удалить объект? Кстати, делает del в Python фактически удаляет объект или удаляет ссылочную переменную? Заранее благодарю за любую помощь!

+1

Почему вы хотите вручную удалить объект? Как вы думаете, что бы достичь? – ajb

+0

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

+0

Ваша предпосылка неверна. Вы не можете удалить объект в Python. 'del s' удаляет имя' s', но ничего не делает для объекта, на который он ссылался. Конечно, если это была единственная ссылка, это делает объект подходящим для сбора мусора, но это ничего особенного - 's = something else' имеет тот же самый эффект. – delnan

ответ

0

Как Мендоса Луиджи сказал, что вы не можете вручную delete.How когда-либо вы можете передать его NULL. Чтобы освободить память, вы можете позвонить System.gc(). Но нет гарантии, что память будет освобождена. Перед удалением объекта из памяти поток коллекции мусора вызывает метод finalize() этого объекта и дает возможность выполнить любую необходимую очистку.

+5

вы ничего не удаляете - вы просто просите запустить сборщик мусора, и JVM может игнорировать вас. –

+0

@AmirAfghani Извините за мою ошибку, я исправлю ее – SpringLearner

+0

@javaBeginner: Редко нужно написать метод 'finalize()'; это очень сложно написать правильно; и само его существование препятствует сбору мусора. См. Http: //www.hpl.hp.ком/личный/Hans_Boehm/misc_slides/java_finalizers.pdf. – Jeremy

1

можно ли сделать что-нибудь подобное на Java?

No.

В лучшем случае вы можете свести на нет объект:

s = null; 

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

s = null; 
... 
s.foo(); //this will throw a NullPointerException 
1

в java наверняка мы не можем удалить объект ... но мы можем попробовать с System.gc(); или если мы хотим потерять ссылку на объект, мы можем установить значение ссылки на объект null; .. но после установки нулевого значения мы не можем получить доступ к объекту, но он все еще остается в памяти ......

1

В общем, вам нужно указать все ссылки на объект, после которого объект больше не может использоваться и будут удалены в следующем GC. Но объекты строковых констант, такие как «Это тест», хранятся в пуле и не удаляются, даже если нет ссылок на них.

+0

Следует подчеркнуть, что сохранение нулей обычно не требуется. Только ссылочные поля или переменные, которые сами достигают, будут поддерживать что-либо живое, поэтому только те, которые должны быть заглушены или направлены на что-то еще. Вот почему редко можно увидеть фактическое x = null; в коде. –

1

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

+0

Неверно, что объекты перестают быть доступными, когда они выходят за рамки. С точки зрения достижимости такие объекты имеют * метод * scope. Итак, 'public void run() {{Object o = new Object(); System.out.println (o);}/* o больше нельзя использовать, но он все еще существует! Итак, это утечка памяти! */while (true) {try {Thread.sleep (Long.MAX_VALUE); } catch (InterruptedException e) {}}} 'никогда не очищает o без' o = null' перед выходом из внутреннего блока. Почему это так имеет смысл, если вы думаете об этом с точки зрения инструкций по кодированию виртуальной машины и Java. – Jeremy

+0

Джереми. В приведенном выше примере утечки памяти нет, и никто не должен хранить нуль в любом месте для выделенного объекта. Когда вы достигнете цикла while (в вашем примере) o выходит за рамки. Объект, о котором он ссылается, уже недоступен, и нет доступа к нему или для восстановления доступности к нему. Он мертв и ушел, и следующий GC с радостью вернет пространство, которое он занял, по мере необходимости, чтобы удовлетворить некоторые будущие ассигнования. –

+0

@GilTene, объекты достижимы до тех пор, пока кадр стека не будет удален, то есть когда метод выйдет. Дополнительные фигурные скобки для создания внутренней области в методах являются синтаксическими и не влияют на структуру стека. Таким образом, следующие два теста проходят: @Test public void testNoGC() {WeakReference ref; {Object o = new Object(); ref = new WeakReference (o); } System.gc(); assertNotNull (ref.get()); } @Test public void testGC() {WeakReference ref; {Object o = new Object(); ref = new WeakReference (o); o = null; } System.gc(); assertNull (ref.get()); } ' – Jeremy

Смежные вопросы