【问题标题】:Scala hit GC overhead when running large external processScala 在运行大型外部进程时遇到 GC 开销
【发布时间】:2015-03-10 20:53:03
【问题描述】:

我有一个外部程序可以生成我需要的一些数据。通常,我将其输出重定向到一个文件,然后从我的 Scala 应用程序中读取它,例如

app.exe > 输出.data

现在,我想整合流程,所以我做了

val stream = "app.exe" lineStream
stream foreach { line => doWork(_) }

不幸的是,一段时间后我得到了 GC 开销 异常。这个app.exe 可能会生成非常大的输出文件,例如超过 100MB。所以我认为在流式传输期间,Scala 一直在创建/销毁 line 字符串实例数千次,并导致开销。

我知道我可以调整 JVM 变量以增加 GC 开销限制。但我正在寻找一种不需要创建很多小的line 实例的方法。

【问题讨论】:

  • GC overheat 到底是什么?
  • 我想你的意思是GC overhead
  • 我更喜欢 GC 过热 :-)

标签: scala garbage-collection


【解决方案1】:

问题可能是由于记忆化,这是以这种方式对流进行 foreach 的副作用。实际上,您正在将整个文件植根于内存中。

在此处查看有关如何避免这种情况的大量信息:http://blog.dmitryleskov.com/programming/scala/stream-hygiene-i-avoiding-memory-leaks/

具体来说,您违反了规则 1。尝试将您的流定义为def,而不是val

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 2016-08-07
    • 2014-08-13
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    相关资源
    最近更新 更多