如何在没有java.lang.OutOfMemoryError的情况下运行这样的东西:无法创建新的本机线程?
def doSomething(): Unit = {
akka.actor
.ActorSystem(System)
.scheduler
.scheduleOnce(1 seconds)(doSomething())
}
答案 0 :(得分:2)
我猜你经常打电话给doSomething
。
Akka' ActorSystem
是一个相对资源密集型的对象。它通常意味着在你的程序的整个生命周期。在引擎盖下,ActorSystem
管理Thread
中的少数ThreadPool
个,所有演员都在其中运行。 ThreadPool
保持活着,直到你告诉它关闭。
如果您经常致电doSomething
,那么您每次都会创建新的ActorSystem
,因此会创建一个新的8个左右的主题。最终JVM无法再创建线程,这将导致您的OOM错误。
解决方案是让您的ActorSystem
实例可用并且#34;全局",并确保在您的程序完成后将其关闭。
object MyGlobals {
val actorSystem = ActorSystem()
}
def doSomething() = {
MyGlobals.actorSystem.scheduler.scheduleOnce(...)
}
// and then at the end of your program
actorSystem.terminate()
答案 1 :(得分:1)
使用schedule方法而不是scheduleOnce方法,而是相应地传递参数。要查看示例,请访问下面的链接。 有关更多信息,请访问:http://doc.akka.io/docs/akka/current/scala/scheduler.html
答案 2 :(得分:1)
如果您只想每1秒执行一次功能,可以这样:
def doSomething(): Unit = ???
akka.actor.ActorSystem()
.scheduler
.schedule(initialDelay = 0 seconds, interval = 1 second)(doSomething())