场景:我有这段代码:
class MyActor extends Actor {
def act() {
react {
case Message() => println("hi")
}
}
}
def meth() {
val a = new MyActor
a.start
a ! Message()
}
是收集的MyActor实例垃圾?如果没有,我该如何确定它?如果我创建一个ad-hoc actor(使用'actor'方法),那个演员GCed?
答案 0 :(得分:3)
有Phillip Haller提到使用特定的调度程序(在Scala 2.8中可用)在垃圾收集之前启用Actor的终止,无论是在全局还是每个actor的基础上。
答案 1 :(得分:2)
使用标准Actor库的内存泄漏导致其他Actor实现。这就是David Pollak和Jonas Boner的Lift电影库的原因,你可以在这里阅读更多信息:http://blog.lostlake.org/index.php?/archives/96-Migrating-from-Scala-Actors-to-Lift-Actors.html
答案 2 :(得分:1)
您是否尝试过添加finalize
方法来查看是否存在?我认为这里的答案是,actor子系统的行为与你期望它的行为没有什么不同:它不会缓存对你的actor的任何引用,除非在处理期间在本地线程中。
因此,我希望你的actor是收集的候选者(假设子系统在actor处理了它确实在Reaction.run
方法中确实发生的消息之后正确地清除了ThreadLocal引用)。 / p>