66

この件に関してすでに尋ねられた質問と多くのグーグルを読んだ後、私はまだ-Xmsオプションを明確に見ることができません

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

今のところ、次の答えがあります。

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

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

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

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

前もって感謝します

マヌー

4

6 に答える 6

38

JVMは、初期ヒープレベルでのメモリ使用量から始まります。maxheapが高い場合、メモリ要件が現在のメモリを超えると、maxheapサイズに拡大します。

それで、

  • -Xms512m -Xmx512m

JVMは512Mから始まり、サイズを変更することはありません。

  • -Xms64m -Xmx512m

JVMは64Mから始まり、memの場合は大きくなります(最大上限512まで)。要件が64を超えています。

于 2009-07-08T14:40:50.017 に答える
34

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

これは、Windowsのタスクマネージャーの代わりにSysinternalsのProcessExplorerを使用して確認できます。

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

于 2009-07-08T14:45:28.790 に答える
15

-Xms標準の Heap パラメーターとは別に、 Perm Gen スペースのサイズを指定するために使用される と-Xmxを知っておくとよいでしょう-XX:PermSize-XX:MaxPermSizeこれは、ヒープ内の他の世代にスペースを確保できても、perm gen スペースがいっぱいになるとメモリが不足する可能性があるためです。このリンクには、いくつかの重要な JVM パラメータの概要も記載されています。

于 2011-11-20T03:50:18.037 に答える
5

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

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

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

于 2009-07-08T14:43:52.693 に答える
4

次のように記述した場合:-Xms512m -Xmx512m起動時に、Javaはその瞬間に512mのRAMをプロセスに割り当て、増分できません。

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

Javaに自動メモリ管理を与えるので、2番目の方が良いと思います。

于 2009-07-08T14:38:36.400 に答える
0

私は、でこのおもちゃの例を作成しまし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。短い一時停止はガベージ コレクションの実行であり、長い一時停止はヒープ割り当てであることは間違いありません。

于 2017-01-11T20:43:57.277 に答える