Nevhodne nakladani s pameti zpusobuje presne, co jste popsal. Immutable objekty, zpracovani velkeho mnozstvi dat ve streamu by mohlo pomoct.
Není naopak naprosto obráceně lepší se těch immutable objektů zbavit? Mít jeden objekt který mění vnitřní stav je přeci pro GC mnohem lepší než pořád vytvářet nové immutable objekty!
Jedine pokud ten objekt, ktery meni stav se nedostane ven z funkce resp. vlakna. Jak se projekt rozrusta, tak se lokalni promena zacne zapisovat do cache atd.
Cokoliv, co je sdilene mezi vlakny - vyuziva cache nebo treba i jen session. Pokud je takovyto objekt sdileny tak mate problem napr. v transakcich, synchronizaci etc. Immutable objekt tento problem nemusi resit.
Tech vytvarenych objektu je naopak mene. Pokud menim immutable objekt (s pouzitim builder objektu), tak se vytvori tyto objekty:
builder a prevezme cleny z immutable objektu, ta cast, kterou je potreba zmenit a vysledny novy immutable objekt.
Pokud chci udelat zmenu objektu, ktery neni immutale, tak abych neovlivnil existujici objekt, tak musim udelat clone. To znamena vytvorit kopie uplne vseho bez ohledu na to, co budu menit. Pocitejte s tim, ze budete narazet na kod:
objekt = objekt.clone()
metoda(objekt)
a ve funkci metoda(objekt){
objekt = objekt.clone()
....
}
protoze si nebudete casem jisti, jestli vse co vola funkci metoda udelalo clone pred zavolanim funkce metoda a protoze je mozne vsechno menit vsude, tak to taky budete delat.
immutable objekty vypadji jako nanic, nez se dostanete k reseni podivnych chyb zpusobenych problemy se synchronizaci a kdyz se pokusite vyuzit distribuovane cache cely problem ziskava novy rozmer

Jestli chcete priklady, tak treba Date mel byt immutable, formatter taky, u Stringu se nikdo nepozastavi nad tim, ze je immutable.
Kolikrat jste uz videl toto?
public class Constants {
public static final SimpleDateFormat date = new SimpleDateFormat("dd.MM.yyyy");
}
Prepis kodu, ktery vyuziva "mutanty" na kod, kde se vyuzivaji immutable objekty je ocistec a rewrite byl nakonec lepsi volba.