scala原生的acotor在任务结束之后并不会被回收,这也就是说,我无法无限制的创建actor。例如在一个HTTP服务器中,如果每个请求都创建一个新的actor处理,这样不久之后就会内存溢出。今天对scala和akka的actor内存使用情况做了简单测试
测试代码如下
import akka.actor.Actor
import akka.actor.Actor.spawn
import akka.actor.PoisonPill
import java.io.FileOutputStream
import java.io.OutputStream
import java.io.OutputStreamWriter
case 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
没有内存泄漏,100m可以负荷连续不断的actor创建
Scala actor performance
执行没多久就outOfMemory
可以很明显看到scala actor gc的问题,即使exit了,也不会被回收。官方的说法是一个actor exit之后甚至可能被重新start。
scala.concurrent.ops也有个spawn方法可以执行异步操作http://www.scala-lang.org/api/current/index.html#scala.concurrent.ops$
- 大小: 51.1 KB
- 大小: 32 KB
分享到:
相关推荐
标题中的“用Scala写的akka actor简单demo”指的是一个使用Scala编程语言编写的Akka Actor系统的基本示例。Akka是轻量级、基于actor模型的框架,它用于构建高度并发、分布式和容错的应用程序。Scala是多范式编程语言...
消息模式的Actor实现是响应式架构中的一个重要组件,而Akka框架则是Scala语言中实现这一模式的首选工具。 Akka是由Lightbend公司开发的一个开源框架,专门用于构建高度并发、分布式和容错的系统。它基于Actor模型,...
scala-actors-2.10 jar包,可以解决 scala-actors-2.10以上版本带来的不兼容问题
### 关于《Scala中的Actor模型》 #### 一、引言 《Scala中的Actor模型》是一本由Philipp Haller和Frank Sommers合著的专业书籍,该书详细介绍了Scala语言中Actor模型的基础理论与实际应用。Philipp Haller不仅是...
通过阅读这本书,开发者不仅可以学习到如何使用Scala和Akka构建响应式系统,还能理解如何利用消息模式和Actor模型来解决并发问题,提升系统的弹性和可靠性。对于想要深入理解并发编程和分布式系统的人来说,这是一本...
根据提供的文件信息,我们可以提炼出几个关键知识点,重点聚焦于“响应式架构”、“消息模式Actor”以及“Scala”和“Akka应用集成”。虽然提供的内容部分并非技术性内容,而是与电子版图书获取相关的信息,但我们仍...
Scala中的Actor模型是其并发编程的核心机制,它是基于消息传递的并发模型,旨在解决多线程编程中常见的竞态条件、死锁等问题。Actor系统允许程序在安全的环境中并行运行,通过异步消息传递来交换信息,避免了共享...
在Scala中,创建和使用Actor非常直观,可以利用ActorSystem来启动和管理Actor,通过定义消息类型和Actor的行为来实现业务逻辑。 在响应式架构中,Actor模型扮演着关键角色,因为它们能够有效地处理异步事件,这正是...
10. **Actor模型**:Akka库是Scala中的并发和分布式计算框架,基于Actor模型,使得编写高性能、容错的应用程序变得简单。 11. **Dotty/Scala 3**:虽然Scala-2.12.3是当前版本,但Scala社区正在开发下一代Scala,即...
### Scala编程基础之Actor并发编程 #### 一、Scala Actor并发编程概述 ##### 1.1 什么是Scala Actor 在Scala中,Actor是一种强大的并行编程模型,它基于事件驱动和消息传递机制。通过Actor,我们可以更加简洁和...
- Actor模型:Scala的Akka库提供了一种基于Actor的并发模型,Actor是轻量级的线程,通过消息传递实现通信,避免了共享状态问题。 - Futures和Promises:Futures用于异步计算,而Promises用于创建Futures,两者结合...
《响应式架构:消息模式Actor实现与Scala、Akka应用集成》由10章构成,详细介绍了使用Actor模型中的响应式消息传输模式的理论和实用技巧。其中包括:Actor模型和响应式软件的主要概念、Scala语言的基础知识、Akka...
"Scala进阶之路-part04-Akka Actor.pdf"专注于Akka框架,这是Scala中用于构建分布式、容错系统的工具。Actor模型是Akka的核心,它提供了并发和并行处理的能力。在这里,你会学习到如何创建和管理Actor,理解Actor...
Scala3,也被称为Scala 3或Dotty,是Scala编程语言的一个重大更新,旨在提高其简洁性、可读性和类型安全性。Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对...