Итак, я немного обманывал время, затрачиваемое на создание Strings vs using StringBuilder, а также немного мусор с сборщиком мусора. Для меня, как студент CS первого года, сборщик мусора немного похож на меня тоже, как на меня, где он просто очищает все и «просто работает». Я был немного смущен, когда я пришел с этим:Сборщик мусора, строки и финализация путаницы
public class Main
{
public static void main(String[] args)
{
long time = System.currentTimeMillis();
new Test();
for (int i= 0; i < 10000; i++)
{
String s = "a";
for (int c = 0; c < 26; c++)
{
s += (Character.toString((char) ('a' + c)));
//s += "testttzzz";
}
}
System.out.println(System.currentTimeMillis() - time);
}
}
class Test
{
@Override
protected void finalize() throws Throwable
{
System.out.println("FINALIZE TEST!");
}
}
Внутри кода выше, если раскомментировать из будет называться линия «s + =„testttzzz“сборщик мусора и будет выводить FINALIZE TEST!
. Однако, если эта строка закомментирована, сборщик мусора не будет работать во время работы программы и вообще не будет выводить FINALIZE TEST!
. Почему это?
Редактировать: Я попытался добавить System.out.println(i);
внутри первого цикла цикла, чтобы я мог видеть, когда вызывается именно System.gc(). Похоже, что добавление этой строки привело к тому, что сборщик мусора больше не запускался. Я действительно смущен.
Edit2: Если это имеет значение, я использую JRE 1.7.0_45
и используя затмение версии 4.3.1 для компиляции кода
EDIT3: Я думаю, это только кажется, что добавленное время от дополнительных строк кода дает сборщик мусора больше времени для запуска и позволяет завершить finalize(). Интересно все же.
Edit4: Хорошо, согласно Джону Скиту, это не так. Сборщик мусора довольно интересен
Это потому, что это не детерминированное поведение. Сборщик мусора отлично работает, он может не собираться, когда вы ожидаете, поэтому, если вы не настроите GC, вы не должны тратить на него слишком много времени. – Kayaman
@ Кайайан Да, я вообще не очень разбираюсь в GC. Я просто подумал, что это что-то интересное и, возможно, причина в том, что это происходит иначе, чем просто непредсказуемость. – user2249516
@arshajii Не, если программа заканчивается до запуска GC. Добавление большего количества кода приводит к запуску GC. – Kayaman