lomeo: (лямбда)
[personal profile] lomeo
Из дискуссии с [livejournal.com profile] sassa_nf.

В 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] sassa_nf всё же заставил java работать правильно. За что ему отдельное спасибо!
From:
Anonymous( )Anonymous This account has disabled anonymous posting.
OpenID( )OpenID You can comment on this post while signed in with an account from many other sites, once you have confirmed your email address. Sign in using OpenID.
User
Account name:
Password:
If you don't have an account you can create one now.
Subject:
HTML doesn't work in the subject.

Message:

 
Notice: This account is set to log the IP addresses of everyone who comments.
Links will be displayed as unclickable URLs to help prevent spam.

Profile

lomeo: (Default)
Dmitry Antonyuk

December 2015

S M T W T F S
  12345
6789101112
131415 16171819
20212223242526
2728293031  

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 24th, 2017 03:35 pm
Powered by Dreamwidth Studios