Как написать программу работающую со сборщиком мусора?
Требуется написать программу на Java, демонстрирующую работу сборщика мусора.
В программе должно быть реализовано следующее:
1. Работа с маленькими объектами и большими объектами (Обычно больше 64 КБ),
2. Финализируемыми объектами,
3. Объектами, пережившими N циклов сборки мусора (N=1,2,3,…),
Подскажете куда копать? Не совсем понимаю как именно это написать
Задание поставлено очень широко. Листинг из примера ниже будет ему в точности соответствовать:
// Работа с большими объектами
byte[] b = new byte[65536];
b[0] = 1;
System.out.println(b[0]);
// и с маленькими
String s = "123";
System.out.println(s.hashCode());
// и с финализируемыми объектами
Object f = new Object() {
@Override
protected void finalize() {
System.out.println("I'm finalized!");
}
};
// Строго говоря, объекты b и s так же являются финализируемыми,
// так как наследуют метод finalize() от своего предка.
// Так что f можно было даже не писать.
System.gc();
System.gc();
System.gc();
System.gc();
// В этом месте объекты b, s и f пережили 4 цикла сборки.
// Наверное... ¯\_(ツ)_/¯
//
// Более точно можно сказать, запустив программу с
// аргументом -verbose:gc или с помощью утилиты visualvm
// В этом месте объекты b, s и f пережили 4 цикла сборки.
// Наверное.. - имеете ввиду что при вызове System.gc() нет гарантии запуска сборки мусора? Грубо говоря JVM сама решает когда ей запустить этот процесс?
Если быть точным, то не jvm решает, а сборщик мусора.
Hotspot, например, честно триггеритсборку (если не используется опция -XX:+DisableExplicitGC). Но вот произойдёт ли она на самом деле - зависит от сборщика.
Точно могу сказать, что при использовании сборщика epsilon вызов System.gc() никогда не приведёт к сборке :)
Этот исходник - медвежья услуга. Как сработает так и не сработает.
В чем проблема топика. GC это общесистемное программное обеспечение которое не регламентируется спекой JLS/JVM.
Грубо говоря GC и его поведение существует в другом измерении. И все усилия последних лет разработки направлены на то чтобы ВЫ (пользователь или разработчик) этот GC не заметили.
В последних разработках (GC Shenandoah от Шипилёва) вообще понятие фаза уборки размыто. Там есть - mark, cleanup, evacuation.
Вобщем все тяжело и непонятно. И все абстракции - слишком натянутые чтоб препод вообще ставил задачи.
Мне казалось комментарий к коду вполне ясно описывает, что System.gc() не позволяет управлять gc. Но судя по вашему комментарию, мне это и правда только казалось...