首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Scala actor gc 有关问题

2012-10-17 
Scala actor gc 问题? ? ? ? ? scala原生的acotor在任务结束之后并不会被回收,这也就是说,我无法无限制的

Scala actor gc 问题

? ? ? ? ? scala原生的acotor在任务结束之后并不会被回收,这也就是说,我无法无限制的创建actor。例如在一个HTTP服务器中,如果每个请求都创建一个新的actor处理,这样不久之后就会内存溢出。今天对scala和akka的actor内存使用情况做了简单测试

?测试代码如下

?

import akka.actor.Actorimport akka.actor.Actor.spawnimport akka.actor.PoisonPillimport java.io.FileOutputStreamimport java.io.OutputStreamimport java.io.OutputStreamWritercase class Work(val index: Int, val output: OutputStream)case class Result(val value: Double)object Task {  def main(args: Array[String]) {    Thread.sleep(15000)    new AkkaActorTask(10000000).execute()  }}trait CalculateTask {  val output: OutputStream  val taskCount: Int  def sendWork(work: Work)  def execute() {    for (i <- 1 to taskCount) {      sendWork(Work(i, output))    }  }}class AkkaActorTask(val taskCount: Int) extends CalculateTask {  val output = Work.akkaTaskOutput  def sendWork(work: Work) {    spawn {      Work.doWork(work)    }  }}class ScalaActorTask(val taskCount: Int) extends CalculateTask {  override val output = Work.scalaTaskOutput  def sendWork(work: Work) {    val actor = new ScalaActorWorker    actor.start()    actor ! work  }  class ScalaActorWorker extends scala.actors.Actor {    def act = {      react {        case work:Work => Work.doWork(work); exit()      }    }  }}object Work {  val resultName = "result-"  val akkaTaskOutput = new FileOutputStream(resultName + "akka")  val scalaTaskOutput = new FileOutputStream(resultName + "scala")  def doWork(work: Work) {    work.output.write("log(%d) = %f".format(work.index, math.log(work.index)).getBytes())    work.output.flush()  }}

?

程序说明:

?计算从0到10,000,000的整形的自然对数(math.log)并写入文件

分别选择Scala和Akka的actor实现,(spwan是一种一次性非常轻量级的akka actor)

下面是测试结果,

?

机器配置

CPU:Intel(R) Core(TM)2 Duo CPU ? ? E8400 ?@ 3.00GHz

RAM :4G

JAVA_OPTS: Xms100m Xmx100m

?

Akka actor performance

Scala actor gc 有关问题

没有内存泄漏,100m可以负荷连续不断的actor创建

?

?

Scala actor performance

?


Scala actor gc 有关问题
执行没多久就outOfMemory?

?

?

可以很明显看到scala actor gc的问题,即使exit了,也不会被回收。官方的说法是一个actor exit之后甚至可能被重新start。

?

scala.concurrent.ops也有个spawn方法可以执行异步操作http://www.scala-lang.org/api/current/index.html#scala.concurrent.ops$

1 楼 andiyang 2011-12-07   兄弟这个是用什么工具测试的 2 楼 jilen 2011-12-08   andiyang 写道兄弟这个是用什么工具测试的
JvisualVm

热点排行