Анализ побега в компиляторе HotSpot C2 довольно прост. Он никогда не пытался обнаружить всех возможных объектов, которые не выходят за рамки компиляции. В частности, в настоящее время он не обрабатывает многоуровневое дерево ссылок.
В вашем примере ссылка на недавно выделенный Point
назначена полю объекта: PointHolder.point
. JIT рассматривает это назначение как экранирование объекта Point
и, таким образом, не устраняет выделение.
Одним конкретным исключением является бокс-распаковка: HotSpot специально обрабатывает методы упаковки-распаковки. Например, он по-прежнему сможет исключить выделение объекта Integer
, если он назначен полю IntegerHolder
.
Хотя эта проблема не является чем-то неразрешимой - это скорее упущенная возможность оптимизации. Graal JIT лучше в этом смысле - в данном примере он исключает устранение как Point
, так и PointHolder
распределений.