1. Самое простое. var = null;
Если нужно ещё и мусорщика пустить — ну пусти, System.gc();
2. Если нужно, чтобы объект не удерживался — WeakReference. Как только объект исчезнет, слабая ссылка перещёлкивается в null. Бывает нужно: 1) если объекты-дети переживают своих владельцев, и при этом потерять владельца — это несмертельно; 2) когда строим какой-нибудь временный список.
3. Не выдавать безымянный объект наружу, если он переживает создателя. В безымянных объектах есть ссылка на создателя. Выдавать лямбду: если создатель не нужен, ссылки никакой не будет.
4. Аналогично с внутренними классами — если он переживает создателя, делай его static.
5. String.intern, если вы работаете с кучей мелких одинаковых строк. Ну или наладить свой кэш :)
6. Использовать объектные пулы и прочие структуры, снижающие нагрузку на мусорщик.
7. Разбивая строки на мелкие кусочки, использовать паттерн doSomething(String data, int start, int length)
, не вытягивая подстроку физически. Использовать StringBuilder.