Про потоки (не мыслей)
Dec. 1st, 2012 03:49 pmИз дискуссии с
sassa_nf.
В java локальные переменные метода не собираются сборщиком мусора, пока мы не выйдем из метода (наверх, разумеется, а не глубже). Это важно, потому что Scala'вские Stream из-за этого часто становятся бесполезны.
Вот имеем мы некий Stream, который любят сравнивать с Haskell'евским списком. И начинаем его обрабатывать. А обработка через некоторое время завешается с OutOfMemoryError:
А теперь перепишем это так:
и обработка у нас будет вестись вечно.
А всё потому, что первый способ генерит astore, который создаёт локальную переменную. А второй — нет.
UPD:
sassa_nf всё же заставил java работать правильно. За что ему отдельное спасибо!
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
В java локальные переменные метода не собираются сборщиком мусора, пока мы не выйдем из метода (наверх, разумеется, а не глубже). Это важно, потому что Scala'вские Stream из-за этого часто становятся бесполезны.
Вот имеем мы некий Stream, который любят сравнивать с Haskell'евским списком. И начинаем его обрабатывать. А обработка через некоторое время завешается с OutOfMemoryError:
val messages = Stream continually nextMessage for (message <- messages) doSomething(message)
А теперь перепишем это так:
for (message <- Stream continually nextMessage) doSomething(message)
и обработка у нас будет вестись вечно.
А всё потому, что первый способ генерит astore, который создаёт локальную переменную. А второй — нет.
UPD:
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)