Sémanticky je tu new pro vytvoření nové instance a toto nesmí optimalizace porušit. Není nutné pokaždé vytvořit nový objekt v heapu, ale pak se musí JIT ujistit, že to nezmění sémantiku programu.
Pro představu:
* Oracle Java 7 umí v některých případech zjistit, že se vytváří defensivní kopie nějakého objektu, ale děje se tak naprosto zbytečně, tak se místo vytvoření kopie prostě předá původní objekt. Toto asi nebude zrovna triviální optimalizace, je nutné se například přesvědčit, že oba objekty nejsou porovnávány podle identity, jinak by to změnilo sémantiku.
* Údajně se taky někdy nové instance vytváří na zásobníku, když JVM dokáže zjistit samotný cyklus.
* Někde jsem taky četl o recyklaci výjimek a nevyplňování stack trace, když JVM zjistí, že to nezmění sémantiku. Možná to říkal Lukáš Křečan, už nevím.
Prostě JVM musí v takových případech dělat dokonalou potěmkinovu vesnici. Nemusí dělat přesně to, co tomu člověk řekne, ale musí ten "podvod" být uvěřitelný pro libovolného vnějšího pozorovatele, ať se v tom šťourá, jak chce.