【问题标题】:Sbt uses more than 512mb of RAM when pulling in dependenciesSbt 在引入依赖项时使用超过 512mb 的 RAM
【发布时间】:2015-10-07 14:25:32
【问题描述】:

所以我试图在 512mb Digital Ocean 服务器上编译和运行一个 scala 项目。基本上,我遇到的问题是,当它开始编译时,它会引入所有依赖项,并最终耗尽内存。这是正常的吗?我知道我想运行的项目不需要超过 512mb,如果为了编译就不得不增加大小是很可惜的。我在这里做错了吗?

这是我的 build.sbt,注意这是使用 sbt.version 13.8

scalaVersion := "2.10.2"

libraryDependencies ++= {
  val akkaV = "2.1.4"
  val sprayV = "1.1.1"
  Seq(
    "com.typesafe.akka"      %%  "akka-actor"        % akkaV,
    "com.typesafe.akka"      %%  "akka-testkit"      % akkaV   % "test",
    "org.specs2"             %%  "specs2-core"       % "2.3.9" % "test",
    "org.twitter4j"          %   "twitter4j-stream"  % "4.0.2",
    "io.spray"               %   "spray-can"         % sprayV,
    "io.spray"               %   "spray-routing"     % sprayV,
    "io.spray"               %   "spray-client"      % sprayV,
    "io.spray"               %   "spray-testkit"     % sprayV,
    "io.spray"               %   "spray-json_2.10"   % "1.2.5",
    "com.github.nscala-time" %%  "nscala-time"       % "1.4.0",
    "com.codahale.metrics"   %   "metrics-core"      % "3.0.1",
    "org.elasticsearch"      %   "metrics-elasticsearch-reporter" % "2.0"
  )
}

enablePlugins(JavaAppPackaging)

//settings(com.typesafe.sbt.SbtNativePackager.packageArchetype.java_application: _*)

Revolver.settings

【问题讨论】:

  • 512MB 对于编译一个大型项目来说是相当乐观的。你可以尝试设置SBT_OPTS为sbt指定最大堆和GC。
  • 所以,基本上如果我想为我的项目使用这个 512mb 服务器,我可能应该只组装一个 .jar,然后将其发送到服务器以运行?好吧,我猜是这样的,这样服务器就不必管理编译了。
  • 我不知道。也许您可以找到使 GC 足够早启动的 JVM 设置,不会超过 512MB。但这纯粹是推测性的。对于组装任务,我猜它会在某个时候将所有罐子拉到内存中。
  • “我可能应该只是组装一个 .jar,然后将其发送到服务器以运行”——是的,这对我来说听起来很明智。

标签: scala sbt


【解决方案1】:

你可以使用一个技巧。 Sbt 对虚拟内存有要求(它忽略低值的 jvm 堆选项),所以打开交换空间(在 DO 映像中默认禁用)。如果实际内存足够,则不会影响性能。

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 2021-11-12
    • 2018-05-19
    • 2019-10-03
    • 1970-01-01
    • 2018-03-20
    • 2019-04-02
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多