[Java-упражнения] Вывод Java-программ | Набор 10 (сборка мусора)

Java задняя часть
[Java-упражнения] Вывод Java-программ | Набор 10 (сборка мусора)

Это 4-й день моего участия в августовском испытании обновлений.Подробности о событии:Испытание августовского обновления

Вы можете прочитать эту статью, которую я написал вчера, чтобы понять-Механизм сборки мусора в Java

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

программа

программа один

Предскажите вывод следующей программы Java:

public class Test
{
	public static void main(String[] args) throws InterruptedException
	{
		String str = new String("Haiyong");
			
		// 使 str 符合 gc 的条件
		str = null;
			
		// 调用垃圾收集器
		System.gc();
			
		// 等待 gc 完成
		Thread.sleep(1000);
	
		System.out.println("end of main");
	}

	@Override
	protected void finalize()
	{
		System.out.println("调用的finalize方法");
	}
}

Нажмите здесь, чтобы перейти к ответу

программа вторая

public class Test
{
	public static void main(String[] args) throws InterruptedException
	{
		Test t = new Test();			
		// 使 t 有资格进行垃圾收集
		t = null;			
		// 调用垃圾收集器
		System.gc();			
		// 等待 gc 完成
		Thread.sleep(1000);	
		System.out.println("end main");
	}
	@Override
	protected void finalize()
	{
		System.out.println("调用的finalize方法");
		System.out.println(10/0);
	}	
}

Нажмите здесь, чтобы перейти к ответу

Процедура третья

public class Test
{
	static Test t ;	
	static int count =0;	
	public static void main(String[] args) throws InterruptedException
	{
		Test t1 = new Test();			
		// 使 t1 有资格进行垃圾收集
		t1 = null; // line 12			
		// 调用垃圾收集器
		System.gc(); // line 15			
		// 等待 gc 完成
		Thread.sleep(1000);	
		// 使 t 有资格进行垃圾收集
		t = null; // line 21			
		// 调用垃圾收集器
		System.gc(); // line 24	
		// 等待 gc 完成
		Thread.sleep(1000);			
		System.out.println("调用finalize方法 "+count+" 次");		
	}	
	@Override
	protected void finalize()
	{
		count++;		
		t = this; // line 38			
	}	
}

Нажмите здесь, чтобы перейти к ответу

программа четыре

public class Test
{
	public static void main(String[] args)
	{
		// 此行之后有多少对象符合垃圾回收条件?
		m1(); // Line 5
	}

	static void m1()
	{
		Test t1 = new Test();
		Test t2 = new Test();
	}
}

Нажмите здесь, чтобы перейти к ответу

Процедура пятая

public class Test
{
	public static void main(String [] args)
	{
		Test t1 = new Test();
		Test t2 = m1(t1); // line 6
		Test t3 = new Test();
		t2 = t3; // line 8
		
	}	
	static Test m1(Test temp)
	{
		temp = new Test();
		return temp;
	}
}

Нажмите здесь, чтобы перейти к ответу


Вторая половина статьи - вывод и анализ программы

60f7e8b025fa0.jpeg

image.png


вывод и разбор

вывод программы

выход:

end of main

объяснять:

Мы знаем, что перед уничтожением объекта сборщик мусора вызовет для него метод finalize(). Но здесь хитрость в том, что str является объектом класса String, а не классом Test. Поэтому метод finalize() класса String (если он переопределен в классе String) вызывается на str. Если класс не переопределяет метод finalize, то метод finalize() класса Object вызывается по умолчанию.

Программа два выхода

выход:

调用finalize方法
end main

иллюстрировать:

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

Программа три выхода

выход:

调用finalize方法 1 次

иллюстрировать:

После выполнения строки 12 t1 готов к сборке мусора. Поэтому, когда мы вызываем сборщик мусора в строке 15, сборщик мусора вызовет метод finalize() для t1, прежде чем уничтожить его. Но в методе finalize в строке 38 мы снова обращаемся к тому же объекту через t, поэтому после строки 38 объект больше не подлежит сборке мусора. Поэтому сборщик мусора не уничтожает объект.

Теперь снова в строке 21 мы снова делаем тот же объект подходящим для сборки мусора. Здесь мы хотим прояснить тот факт, что сборщик мусора будет вызывать метод finalize() для конкретного объекта, находящегося вОдинвремя. Поскольку для этого объекта уже был вызван метод finalize(), теперь сборщик мусора уничтожит его без повторного вызова метода finalize().

Запрограммируйте четыре ответа

вопрос:После выполнения строки 5, сколько объектов имеет право на сбор мусора?

отвечать :

2

иллюстрировать:

Поскольку t1 и t2 являются локальными объектами для метода m1(), если ни один из них не возвращен, они подлежат сборке мусора после завершения метода.

Программа пять ответов

вопрос:После выполнения строки 8, сколько объектов может быть подвергнуто сборке мусора?

отвечать :

1

проиллюстрировать:

К моменту выполнения строки 8 единственным объектом, на который не ссылаются, является объект, сгенерированный в строке 6. Помните, что "Java строго передает по значению", поэтому ссылочная переменная t1 не затрагивается методом m1(). Мы можем проверить это с помощью метода finalize(). Оператор «System.out.println(this.hashcode())» в методе finalize() печатает значение хэш-кода объекта, вызвавшего метод finalize(), а затем сравнивает это значение с другими созданными значениями хэш-кода объекта. в основном методе.


Это все для этой статьи

Статьи по Теме:

[Вопросы по практике Java] Вывод программ на Java | Первый набор (включая синтаксический анализ)
[Вопросы по практике Java] Вывод программ Java | Второй набор (включая синтаксический анализ)
[Вопросы по практике Java] Вывод Java-программ | Третий набор (включая синтаксический анализ)
[Вопросы по практике Java] Вывод программ Java | Четвертый набор (включая анализ)
[Вопросы по практике Java] Вывод Java-программ | Пятый набор (включая анализ)
[Вопросы по практике Java] Вывод Java-программ | Шестой набор (включая синтаксический анализ)
[Вопросы по практике Java] Вывод программ Java | Седьмой набор (включая анализ)
[Вопросы по практике Java] Вывод Java-программ | Восьмой набор (включая анализ)
[Java-упражнения] Вывод Java-программ | Девятый набор (включая синтаксический анализ)

Я давно веду блог о технологиях, и это одна из моих технических статей/руководств. Надеюсь, вам это понравится! Вот краткое изложение всех моих оригинальных и исходных кодов работ:GitHub, и это блог, который я недавно создал сам:haiyong.site,контента в ней не так много,есть какие-то HTML игры,если интересно можете попробовать.Вы можете сами скопировать исходники по F12,или спросите у меня напрямую.

Если вы действительно узнали что-то новое из этой статьи, ставьте лайк, добавляйте в закладки и делитесь с друзьями. 🤗Наконец, не забудьте поддержать ❤ или 📑