Akka Actors Still Available After Stopped by PoisonPill

589 Views Asked by At

I'm using akka to dynamically create actors and destroy them when they're finished with a particular job. I've got a handle on actor creation, however stopping the actors keeps them in memory regardless of how I've terminated them. Eventually this causes an out of memory exception, despite the fact that I should only have a handful of active actors at any given time.

I've used:

self.tell(PoisonPill, self)

and:

context.stop(self)

to try and destroy the actors. Any ideas?

Edit: Here's a bit more to flesh out what I'm trying to do. The program opens up and spawns ten actors.

val system = ActorSystem("system")
(1 to 10) foreach { x => 
  Entity.count += 1
  system.actorOf(Props[Entity], name = Entity.count.toString())
}

Here's the code for the Entity:

class Entity ()  extends Actor {
  Entity.entities += this
  val id = Entity.count
  import context.dispatcher
  val tick = context.system.scheduler.schedule(0 millis, 100 millis, self, "update")
  def receive = {
    case "update" => {
      Entity.entities.foreach(that => collide(that))
    }
  }
  override def postStop() = tick.cancel()
  def collide(that:Entity) {
    if (!this.isBetterThan(that)) {
      destroyMe()
      spawnNew()
    }        
  }
  def isBetterThan() :Boolean = {
    //computationally intensive logic
  }
  private def destroyMe(){
    Entity.entities.remove(Entity.entities.indexOf(this))
    self.tell(PoisonPill, self)
    //context.stop(self)
  }
  private def spawnNew(){
    val system = ActorSystem("system")
    Entity.count += 1
    system.actorOf(Props[Entity], name = Entity.count.toString())
  }  
}
object Entity {
  val entities = new ListBuffer[Entity]()
  var count = 0
}
1

There are 1 best solutions below

1
On

Thanks @AmigoNico, you pointed me in the right direction. It turns out that neither

self.tell(PoisonPill, self)

nor

context.stop(self)

worked for timely Actor disposal; I switched the line to:

system.stop(self)

and everything works as expected.