Уничтожение объектов Java, вы действительно знаете?

Java задняя часть

Эта статья участвует"Проект "Звезда раскопок"", чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.​

В повседневной разработке мы все знаем, что очистка памяти в Java выполняется сборщиком мусора, так как же он очищает бесполезные объекты?

Автоматическое освобождение памяти языка Java называется механизмом сборки мусора, или сокращенно GC. Сборка мусора относится к использованию JVM для освобождения памяти, занятой объектами, которые больше не используются.

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

Как правило, объект обрабатывается как сборщик мусора в следующих двух случаях.

1) Ссылка на объект выходит за его рамки.

{
    Object o = new Object();    // 对象o的作用范围,超过这个范围对象将被视为垃圾
}

2) Объекту присваивается значение null

{
    Object o = new Object();
    o = null;    // 对象被赋值为null将被视为垃圾
}

Класс Object в Java также предоставляет метод finalize() защищенного типа, поэтому любой класс Java может переопределить этот метод и освободить связанные ресурсы, занятые объектом в этом методе.

Тогда снова возникает вопрос, какого черта finalize(), раз будет вызываться этот метод объекта, значит, этот метод будет у всех классов (ведь все классы будут переработаны), естественно думаем о корне класс Java Object.Войди и посмотри?

protected void finalize() throws Throwable { }

Последняя строка действительно найдена. Это метод с пустой реализацией. Поскольку он защищен, это означает, что конкретный метод можно оставить для реализации подклассам. Ранее мы говорили, что объект будет использоваться только тогда, когда объект не на который больше не указывает любая ссылка. Так ли это на самом деле? Возьмем каштан

public class User {
private int money;

public int getMoney() {
return money;

}

public void setMoney(int money) {
this.money = money;

}
public void cool(){
String str=new String();
}

@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub

if(money>0){
System.out.println("error");

}else{
System.out.println("suceess");
}
super.finalize();

}

}

Здесь мы переписываем метод finalize(): если перед уничтожением фронт человека не был израсходован, печать этого человека — неудача, иначе — успех. Ниже приведен наш код в main()

public class Test {
public static void main(String args[]){
User u1=new User(200);
new Object();
new User(100);

}

}

Результат бега - ничего! После завершения операции не только u1, на который указывает ссылка, но и новый User(100);, на который не указывает никакая ссылка, не перерабатывается. Что тут происходит?

Давайте посмотрим, как это объясняется в Thinking In Java.

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

Если мы хотим увидеть эффект, мы можем сделать это следующим образом:

public class Test {
public static void main(String args[]){
User u1=new User(200);

new Object();

new User(100);

System.gc();

}

}

System.gc(); заставит работать системный сборщик мусора, и будет ошибка в эффекте запуска

Описание new User(100); Созданный объект перерабатывается.

Примечание. Вызов методов System.gc() или Runtime.gc() также не гарантирует, что операция сбора будет выполнена, а только увеличивает вероятность того, что сборщик мусора Java соберет мусор как можно быстрее. 

Дополнительные знания:

В области кучи виртуальной машины Java каждый объект может находиться в одном из трех состояний.

1) Достижимое состояние: когда объект создается, пока в программе есть ссылочные переменные, которые ссылаются на него, он всегда находится в доступном состоянии.

2) Восстанавливаемое состояние: когда в программе больше нет ссылочных переменных для ссылки на объект, объект переходит в возрождаемое состояние. В этом состоянии сборщик мусора подготовится к освобождению занимаемой им памяти. Перед освобождением он вызовет метод finalize() для него и других объектов в восстанавливаемом состоянии.Эти методы finalize() могут привести к повторной передаче объекта. до достижимого состояния.

3) Неприкосновенное состояние: когда виртуальная машина Java выполняет методы finalize() всех восстанавливаемых объектов, если ни один из этих методов не делает объект доступным, сборщик мусора фактически вернет занимаемую им память.

Хорошо, давайте сегодня поделимся этим здесь, я Сяо Ао, увидимся в следующем выпуске~~

Обновление статьи о пунше80/ 100 дней