【问题标题】:Spray, Slick, Spark - OutOfMemoryError: PermGen space喷雾、光滑、火花 - OutOfMemoryError:PermGen 空间
【发布时间】:2016-04-10 06:20:06
【问题描述】:

我已经使用SpraySlick 成功实现了一个简单的Web 服务,它通过Spark ML 预测管道传递传入请求。在我尝试添加数据层之前,一切正常。我选择了 Slick,它似乎很受欢迎。

但是,我不能让它正常工作。我的大部分代码都基于Hello-Slick Activator Template。我像这样使用 DAO 对象:

object dataDAO {
  val datum = TableQuery[Datum]

  def dbInit = {
    val db = Database.forConfig("h2mem1")
    try {
      Await.result(db.run(DBIO.seq(
        datum.schema.create
      )), Duration.Inf)
    } finally db.close
  }

  def insertData(data: Data) = {
    val db = Database.forConfig("h2mem1")
    try {
      Await.result(db.run(DBIO.seq(
        datum += data,
        datum.result.map(println)
      )), Duration.Inf)
    } finally db.close
  }
}

case class Data(data1: String, data2: String)

class Datum(tag: Tag) extends Table[Data](tag, "DATUM") {
  def data1 = column[String]("DATA_ONE", O.PrimaryKey)
  def data2 = column[String]("DATA_TWO")
  def * = (data1, data2) <> (Data.tupled, Data.unapply)
}

我在 Boot 对象中初始化我的数据库

object Boot extends App {
  implicit val system = ActorSystem("raatl-demo")
  Classifier.initializeData
  PredictionDAO.dbInit
  // More service initialization code ...
} 

我尝试在完成服务请求之前向我的数据库添加一条记录

val predictionRoute = {
  path("data") {
    get {
      parameter('q) { query =>
        // do Spark stuff to get prediction
        DataDAO.insertData(data)
        respondWithMediaType(`application/json`) {
          complete {
            DataJson(data1, data2)
          }
       }
     }
   }
}

当我向我的服务发送请求时,我的应用程序崩溃

java.lang.OutOfMemoryError: PermGen 空间

我怀疑我错误地实现了 Slick API。从文档中很难分辨,因为它将所有操作都塞进一个 main 方法中。

最后我的conf和activator ui一样

h2mem1 = {
  url = "jdbc:h2:mem:raatl"
  driver = org.h2.Driver
  connectionPool = disabled
  keepAliveConnection = true
}

有没有人遇到过这种情况?我正在使用 Slick 3.1

【问题讨论】:

  • 最简单的方法是在 Java8 上运行,因为 PermGen 已被弃用。

标签: scala apache-spark out-of-memory slick spray


【解决方案1】:

java.lang.OutOfMemoryError: PermGen space 通常不会影响您的使用,这里是oracle says about this

详细信息 PermGen space 表示永久代已满。永久代是堆中存储类和方法对象的区域。如果应用程序加载了大量的类,则可能需要使用 -XX:MaxPermSize 选项来增加永久代的大小。

我不认为这是因为 Slick API 的不正确实现。这可能是因为您正在使用加载许多类的多个框架。

您的选择是:

【讨论】:

  • 已更改为 Java 8,瞧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
相关资源
最近更新 更多