Вы получаете утечки памяти только тогда, когда объект доступен через стек, и вы больше не хотите, чтобы он был в памяти.
Примером будет что-то вроде этого:
public class Main
{
private static CommandLineArgumentParser parser;
public static void main(final String[] argv)
{
parser = new CommandLineArgumentParser(argv);
... use the parser
... never use the parser again ....
... do a bunch of work ...
}
}
Синтаксический анализатор больше не используется, но он все еще доступен, так что с технической точки зрения это утечка памяти (память, которую вы больше не хотите использовать, но которую сборщик мусора еще не может исправить).
Чтобы он больше не использовался, все, что вам нужно сделать, это установить его на ноль или переназначить его, тогда память можно будет собрать.
В случае переноса, когда «корневой» объект исчезает, и пока нет других активных ссылок, все объекты переноса будут иметь право на сборку мусора. Таким образом, как только стартовый зуб вернет все объекты, созданные в нем, их можно будет собрать.