Scala akka.pattern.after:内存泄漏

Scala akka.pattern.after:内存泄漏,scala,memory-leaks,akka,thread-dump,Scala,Memory Leaks,Akka,Thread Dump,下面的代码导致我的play Scala web服务内存泄漏。当我使用threadDump时,我注意到PluginTimeout线程一直在等待,从未执行过 override final def execute:Future[Any] = { val f1 = executePlugin // this returns a future val system = ActorSystem("PluginTimeout") val timeoutFuture = akka.

下面的代码导致我的play Scala web服务内存泄漏。当我使用threadDump时,我注意到PluginTimeout线程一直在等待,从未执行过

  override final def execute:Future[Any] = {
    val f1 = executePlugin // this returns a future

    val system = ActorSystem("PluginTimeout")
    val timeoutFuture = akka.pattern.after(timeout, system.scheduler) { throw new TimeoutException(s"{$name} timed out")  }
    Future.firstCompletedOf(f1 :: timeoutFuture :: Nil)
  }
这就是我的线程转储的样子。在进行了几次threa转储之后,我注意到在每个后续的线程转储中,plugintimeout对象的数量不断增加

"PluginTimeout-akka.actor.default-dispatcher-2" #2308 prio=5 os_prio=31 tid=0x00007fa02c84f800 nid=0x88707 waiting on condition [0x00000001803a3000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000007ab6f5d68> (a akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinPool)
        at scala.concurrent.forkjoin.ForkJoinPool.scan(ForkJoinPool.java:2075)
        at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

   Locked ownable synchronizers:
        - None

"PluginTimeout-scheduler-1" #2307 prio=5 os_prio=31 tid=0x00007fa02b34f800 nid=0x80f07 sleeping[0x000000017f16d000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at akka.actor.LightArrayRevolverScheduler.waitNanos(LightArrayRevolverScheduler.scala:81)
        at akka.actor.LightArrayRevolverScheduler$$anon$4.nextTick(LightArrayRevolverScheduler.scala:260)
        at akka.actor.LightArrayRevolverScheduler$$anon$4.run(LightArrayRevolverScheduler.scala:230)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - None
“PluginTimeout akka.actor.default-dispatcher-2”#2308 prio=5 os_prio=31 tid=0x00007fa02c84f800 nid=0x88707等待条件[0x00000001803a000]
java.lang.Thread.State:等待(停车)
在sun.misc.Unsafe.park(本机方法)
-停车等待(akka.dispatch.ForkJoinExecutor配置程序$AkkaForkJoinPool)
位于scala.concurrent.forkjoin.ForkJoinPool.scan(ForkJoinPool.java:2075)
位于scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
在scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)中
锁定可拥有的同步器:
-没有
“PluginTimeout-scheduler-1”#2307优先级=5 os_优先级=31 tid=0x00007fa02b34f800 nid=0x80f07休眠[0x000000017f16d000]
java.lang.Thread.State:定时等待(休眠)
位于java.lang.Thread.sleep(本机方法)
在akka.actor.LightArrayRevolverScheduler.waitNanos(LightArrayRevolverScheduler.scala:81)
在akka.actor.LightArrayRevolverScheduler$$anon$4.nextTick(LightArrayRevolverScheduler.scala:260)
在akka.actor.LightArrayRevolverScheduler$$anon$4.run(LightArrayRevolverScheduler.scala:230)
运行(Thread.java:745)
锁定可拥有的同步器:
-没有

如果我从方法中删除未来超时逻辑,我看不到内存泄漏的任何问题。这里可能发生了什么。一种可能的解释是,如果另一个未来成功并一直等待永恒,那么时间永远不会被执行。这会导致多个期货累积并占用内存。有什么线索吗?

您正在创建许多Actor系统(
n
系统用于执行调用)

ActorSystem相当沉重,因为它包含配置线程池等

您应该改为使用
1
ActorSystem,并在逻辑中使用它。
例如,通过隐式地传递它:
def execute()(隐式系统:ActorSystem)

您正在创建许多ActorSystem(
n
用于
n
execute调用的系统)

ActorSystem相当沉重,因为它包含配置线程池等

您应该改为使用
1
ActorSystem,并在逻辑中使用它。
例如,通过隐式传递它:
def execute()(隐式系统:ActorSystem)

ActorSystem是一个重量级对象,您为每个创新创建一个,而不是关闭它。ActorSystem是一个重量级对象,您为每个创新创建一个,而不是关闭它。