Оптимизирует ли компилятор scala использование памяти, удаляя ссылки на val
, используемые только один раз в блоке?
Представьте себе объект, содержащий в совокупности некоторые огромные данные - достигнув размера, при котором клонирование данных или их производных вполне может поцарапать максимальный объем памяти для JVM/машины.
Минимальный пример кода, но представьте себе более длинную цепочку преобразований данных:
val huge: HugeObjectType
val derivative1 = huge.map(_.x)
val derivative2 = derivative1.groupBy(....)
Будет ли компилятор, например. оставить huge
помеченным как пригодный для сборки мусора после того, как derivative1
будет вычислено? или он будет поддерживать его до тех пор, пока блок упаковки не будет закрыт?
Неизменяемость хороша в теории, лично я нахожу ее захватывающей. Но чтобы быть пригодным для объектов больших данных, которые не могут обрабатываться в потоке поэлементно в современных операционных системах, я бы сказал, что это по своей сути несоответствие импеданса с разумным использованием памяти, поскольку приложение больших данных на JVM не не так ли, если только компиляторы не оптимизируют такие вещи, как этот случай.