Пусть распределения Я несколько крупных объектов (например, вектор размера N, который может быть очень большим) и выполнить последовательность операций м на нем:Глубокие стеки функционального программирования предотвращают сбор мусора в JVM?
fm(.. f3(f2(f1(vec))))
с каждым возвращающей коллекцию размера N.
Для простоты будем считать, не каждый е достаточно просто
def f5(vec: Vector[Int]) = { gc(); f6( vec.map(_+1)) }
Так, больше VEC не имеет будущие ссылки в точке, где производится каждый последующий вызов. (VEC параметра f1 никогда не используются после того, как f2 вводится, и так далее, для каждого вызова)
Однако, поскольку большинство JVMs не уменьшают ссылки до тех пор, раскручивается стек (AFAIK), это не моя программа требуется к потребляют память NxM. Для сравнения в следующем стиле только 2XM требуется (и в меньшей степени в других реализациях)
var vec:Vector[Int] = ...
for (f <- F) {
vec = f(vec)
gc()
}
ли существует та же проблема для хвостовых рекурсивных методов?
Это не просто академическое упражнение - в некоторых типах проблем с большими данными мы можем выбрать N, чтобы наша программа полностью вписывалась в ОЗУ. В этом случае я должен быть обеспокоен тем, что один стиль конвейерной обработки предпочтительнее другого?
Почему бы не использовать 'view', если вы хотите сохранить память? –
@VictorMoroz или даже лучше, замените вектор итератором. Но это не вопрос. Долговечные ссылки на стеки предотвращают GC? – user48956