Нет. Не гарантируется, что GC когда-либо произойдет, не говоря уже о System.gc()
, не говоря уже о том, что финализаторы когда-либо будут запущены.
теперь вопрос в том, почему случается так, что иногда его вызывают, а иногда нет
Поскольку сборщик мусора и финализация могут выполняться в результате System.gc()
: ничто не может остановить это, так что происходит, а если нет, то нет, потому что нет гарантии.