我目前正在使用Scala第二版编程来学习Scala 2.8。
但我开始真的关注像Clojure vs Scala
这样的帖子Scala在内存泄漏方面是不是很糟糕,这不是我听到的关于actor和内存泄漏问题的第一个信息。
那是不是很糟糕?是在合理的时间内修复它的新版本吗?如果合并的话,Akka会解决所有问题吗?
因为看到 scala最大强点之一的大问题(至少对我来说Erlang就像演员是lang的主要糖果之一)如果他们不能够,那真的是一个主要的缺点修复它们并在其上进行改进。
答案 0 :(得分:8)
我知道人们使用了大量的演员,所以我很确定内存泄漏并不普遍。
Scala Actors在2009年是否有内存泄漏(Scala 2.7.x)?是的,他们确实。例如,SI-1801和SI-1948。
目前,我发现内存泄漏有三张故障单:SI-3467,SI-3920和SI-3921。
我确实对您提出的一条评论提出异议:
scala最大的一个强点(至少对我来说Erlang就像演员一样) 是lang的主要糖果之一
演员是 NOT 语言的一部分!他们是一个图书馆!这就是Scala的全部意义,它是Scala名称的“可扩展”的意思:你可以通过库添加像这样的东西。
现在,在Scala中有四个不同的actor实现:主库,Scalaz,Lift和Akka。绝对没有的原因让您将自己绑定到标准库中。事实上,主要图书馆中的参与者面临的一个问题是他们写的更多是为了证明人们可以做到而不是解决实际问题。
如果你想使用演员,请使用Akka。您现在可以使用它。如果你遇到句法受虐狂,你甚至可以将它与Java一起使用。 Akka是一个极好的库,它不仅仅是提供演员,还提供所有支持工具以使它们有用(如主管和负载均衡器),以及其他完全支持并发的工具,如Agent(Clojure风格),STM (基于Multiverse),与Spring,Camel,AMQP等的整合
Scala的优势在于可以通过库扩展它。如果你将自己局限于标准库中的内容,那么你就是把它扔掉了。
答案 1 :(得分:3)
你应该试试Akka。它非常坚固,轻巧且可调。例如,您可以bound mailbox sizes(并选择邮箱已满时要执行的操作)。
答案 2 :(得分:1)
我不太了解Scala内部,但我猜想Scala的actor实现是在没有限制的情况下对每条消息进行排队。
如果演员没有足够快地从队列中拉出来,队列就会增长并消耗内存。
我想一个较少内存的愤怒实现会立即限制排队消息的数量,从而消耗更少的内存(但是当队列已满时也会阻塞消息发送者)。