3

私はこの非常にシンプルなコントローラーを持っています。

package controllers.WebService

import play.api.mvc.{Action, Controller}

object TestLeak extends Controller {
  def index = Action {
    Ok((1 to 100000).mkString)
  }
}

ブラウザで開きますが、システムのメモリ消費量は2516MBです。ページを更新するたびに、更新するたびにメモリが1〜2MB増加します。あなたはそれがブラウザのせいであると言うかもしれませんが、私は別のPCからそれをヒットし、同じ結果になりました。また、abベンチはそれを確認します。-c 100 -n 1000は、600mbでメモリ消費を開始します。

そして、そのメモリ割り当ては決して下がらない

System.gc()を使用すると問題は解決しますが、パフォーマンスが非常に低くなります。何が起こっている?

Akka.futureとscala.futureとasyncでも同じ問題が発生します。他の輸入品や特性は含まれていません。ちょうどあなたが見るもの。

私はしばらくの間この問題を抱えており、System.gc()なしではHerokuにデプロイできません。解決策はありますか?

UPDATE実際にはJAVA_OPTSはheroku(愚かな私)によって使用されていません。Procfileに宣言する必要があります。

web: target/start -Dhttp.port=${PORT} ${JAVA_OPTS} ... 

JAVA_OPTS: -Xmx384m -Xss512k -XX:+UseCompressedOops -Dfile.encoding=UTF8

メモリ消費量が500を超えることはありません(heroku制限)

時間をありがとうeveyone

4

1 に答える 1

5

遊びには関係ないと思います。これは私には正常な動作のように思えます。JVM は、要求の直後にガベージを収集しません。収集するタイミングを (変更可能な gc 設定に基づいて) 独自に決定します。メモリ不足でアプリケーションがクラッシュしたことはありませんか? これに jconsole をアタッチし、大量のリクエストで ab を実行すると、メモリが最終的に解放されることがわかります。

于 2013-02-12T13:54:39.797 に答える