4

场景:我有这个代码:

class MyActor extends Actor {
   def act() {
     react { 
       case Message() => println("hi")
     }
   }
}

def meth() {
  val a = new MyActor
  a.start
  a ! Message()
}

MyActor 实例是否被垃圾收集?如果不是,我如何确保它是?如果我创建了一个临时演员(使用“演员”方法),那个演员是 GCed 吗?

4

3 回答 3

3

scala-user邮件列表上的这个线程是相关的。

Phillip Haller 提到使用特定的调度程序(在 Scala 2.8 中可用)在垃圾收集之前启用 Actor 的终止,无论是在全局还是每个 Actor 的基础上。

于 2009-11-26T15:58:23.587 回答
2

标准 Actor 库的内存泄漏导致其他 Actor 实现。这就是 David Pollak 和 Jonas Boner 的 Lift Actor 库的原因,您可以在此处阅读更多信息:http://blog.lostlake.org/index.php?/archives/96-Migrating-from-Scala- Actors- to-Lift-Actors.html

于 2009-11-26T15:34:11.487 回答
1

你有没有尝试添加一个finalize方法来查看它是否是?我认为这里的答案是 Actor 子系统的行为与您期望的行为没有什么不同:它不会缓存对您的 Actor 的任何引用,除非在处理期间的线程本地中。

因此,我希望您的参与者是收集的候选对象(假设子系统在参与者处理了它确实在Reaction.run方法中确实出现的消息后正确清除了 ThreadLocal 引用)。

于 2009-11-25T15:04:41.283 回答