web-dev-qa-db-ja.com

JVMヒープパラメーター

主題に関するすでに質問された質問と多くのグーグルを読んだ後、私はまだ-Xmsオプションの明確なビューを持つことができません

私の質問は:Java -Xms=512m -Xmx=512mJava -Xms=64m -Xmx=512mの違いは何ですか?

今のところ、私は次の答えを持っています:

唯一の違いは、アプリケーションの実行中に実行されるガベージコレクションの数とメモリ割り当ての数です。私は正しいですか?

この答えの理由は次のとおりです。

-Xmsオプションを512mに設定しても、アプリケーションが起動後に実際に512Mの物理メモリを使用することにはなりません。これは、最新のOS仮想メモリ管理と遅延ページ割り当てに関連していると思います。 (-Xms512Mまたは64Mに設定しても、LinuxのtopまたはWindowsのタスクマネージャーによって報告される初期使用メモリはまったく変更されないことに気付きました)

誰かがこのXmsオプションの影響を理解するのを手伝ってくれますか、それを理解するのに役立つリンクを教えてくれますか?

前もって感謝します

マヌ

64
Manuel Selva

リンク後に見つかった情報を要約するには:JVMは-Xmsで指定された量を割り当てますが、OSは通常、実際のページが必要になるまで割り当てません。したがって、JVMはXmsによって指定された仮想メモリを割り当てますが、必要に応じて物理メモリのみを割り当てます。

これは、Windowsのタスクマネージャーではなく、SysinternalsのProcess Explorerを使用して確認できます。

そのため、-Xms64Mと-Xms512Mの使用には実際の違いがあります。しかし、最も重要な違いはあなたがすでに指摘したものだと思います:ガベージコレクターは、512MBが本当に必要なのに64MBから始めた場合、より頻繁に実行されます。

34
Turismo

JVMは、初期ヒープレベルのメモリ使用量で開始します。 maxheapの方が大きい場合、メモリ要件が現在のメモリを超えると、maxheapサイズまで増加します。

そう、

  • -Xms512m -Xmx512m

JVMは512 Mで始まり、サイズ変更はされません。

  • -Xms64m -Xmx512m

JVMは64Mで始まり、memの場合に成長します(最大512まで)。要件が64を超えています。

35
Steve B.

標準のヒープパラメータ-Xmsおよび-Xmx以外に、-XX:PermSizeおよび-XX:MaxPermSizeを知っておくと便利です。ヒープ内の他の世代では、perm genスペースがいっぱいになるとメモリが不足する可能性があります。このリンクには、いくつかの 重要なJVMパラメーター の概要もあります。

14
Seema Kiran

JVMはヒープを適応的にサイズ変更します。つまり、アプリケーションに最適なヒープサイズを見つけようとします。 -Xmsおよび-Xmxは、JVMが動作してヒープのサイズを変更できる範囲を指定するだけです。 -Xmsと-Xmxが同じ値の場合、JVMのヒープサイズはその値で一定のままになります。

通常、JVMの起動時にJVMに大きなヒープを与える必要がある特別な理由がない限り、-Xmxを設定してJVMに最適なヒープサイズを見つけさせるのが最善です。

JVMが実際にOSからメモリを要求する場合、それはJVMのプラットフォームと実装に依存すると考えています。アプリが実際に必要とするまでメモリを要求しないと思います。 -Xmxおよび-Xmsはメモリを予約するだけです。

5
bajafresh4life

あなたが書いた場合:-Xms512m -Xmx512m起動時に、Javaはそのプロセスで512mのRAMを割り当て、インクリメントできません。

-Xms64m -Xmx512m開始時、Javaはプロセスに64mのRAMのみを割り当てますが、Javaは512mの間にメモリ占有を増やすことができます。

Javaに自動メモリ管理を与えるため、2番目の方が優れていると思います。

4
Tommaso Taruffi

scalamy_file.scalaでこのおもちゃの例を作成しました。

object MyObject {

    def main(args: Array[String]) {
        var ab = ArrayBuffer.empty[Int]

        for (i <- 0 to 100 * 1000 * 1000) {
            ab += i
            if (i % 10000 == 0) {
                println("On : %s".format(i))
            }
        }
    }
}

私はそれを実行しました:

scala -J-Xms500m -J-Xmx7g my_file.scala

そして

scala -J-Xms7g -J-Xmx7g my_file.scala

-Xms500mバージョンには確かに顕著な休止があります。短い一時停止はガベージコレクションの実行であり、長い一時停止はヒープの割り当てであると確信しています。

0
Akavall