2009-07-08 8 views
59

読書はすでに対象と私はまだ-XmsJVMのヒープパラメータ

私の質問があるオプションの明確な見解持つことができないのですグーグルの多くに質問をした後:java -Xms=512m -Xmx=512mjava -Xms=64m -Xmx=512mの違いは何を?

今、私は次のような答えを持っている場合:

唯一の違いは、私のアプリケーションの実行とメモリ割り当ての数の間に実行されるガベージコレクションの数です。私は正しい?起動後、物理メモリの実際512Mを使用して自分のアプリケーションにはなりません512m-Xmsオプションを設定する

:ここ

は私のこの回答の理由です。私は、これが現代のOSの仮想メモリ管理とレイジーページの割り当てに関係していると思います。 (私は 512Mまたは 64M-Xmsを設定するLinux上のトップで、Windowsではタスクマネージャのいずれかによって報告されたすべての初期に使用されるメモリで変更されないことに気づいた)

は、誰かがこのXmsの影響を理解するために私を助けることができる 私がそれを理解するのに役立つリンクを私に指摘してください。事前

マヌー

答えて

31

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

これは、WindowsのタスクマネージャではなくSysinternalsによるプロセスエクスプローラを使用して確認できます。

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

+12

実際の構文は-Xms64mであり、-Xms = 64mではないと思います。私が間違っている場合は、ロールバックしてください! – Burkhard

+1

これは、jvm configの細かい点のいくつかを研究しています。ここで受け入れられた答えは、これらの値の私の理解とは非常に異なっています。はい、大部分のOSは、アプリケーションがmallocされたメモリにアクセスしようとするとマイナーページフォールトが発生したときに物理ページを利用できますが、Xmsはjvmによってmallocされるメモリの初期量を指定します。メモリなしで割り当てることができるページ数*アプリケーションがメモリを増やしていない - そしてJavaの場合、メモリが不足している場合はmalloc以上のメモリー(Xmxまで)gc – symcbean

+0

@symcbean混乱している。あなたの理解は、答えにあるものと実際に違うものではないようです。あなたはちょうど異なる言葉を使用していますが、まったく同じ動作を記述しています。 – Turismo

4

おかげであなたが書いた場合: それは開始 -Xms512m -Xmx512m、Javaは彼のプロセスとカントの増加のためのラムのそれらの瞬間の512メートルに割り当てます。

-Xms64m -Xmx512m 開始時には、Javaは自分のプロセスに64mのRAMしか割り当てませんが、javaは512mのメモリ占有量を増やすことができます。

私はJavaに自動メモリ管理を提供するので、2番目のことはより良いと思います。

+0

私はそれを知っています。しかし、「Javaがその瞬間512mに割り当てるのは」正確にはどういう意味ですか?このメモリは効果的に割り当てられていないようです。なぜなら、私の512mバイトシステムは、Javaアプリケーションで数MBしか使用されていないスワップやリプリントなしにいくつかの他のアプリケーションを起動することができるからです。 –

+1

なぜこれが下降しましたか?それは正しいかもしれないし、そうでないかもしれない最後の文を除いて、技術的に正しいです。高性能の世界では、Javaが1つのbrk()で必要なすべてのメモリを割り当てるようにするのは、普通はスマートです。他の状況では、使用するときにメモリを割り当てることがよりスマートになる可能性があります。 – Fredrik

+0

私はこの回答を自分自身downvotedしませんでした。あなたのコメントについては、私はダンに尋ねたものと同じ質問があります: Xmsの値をXmxと同じ値に設定することには、「危険」または欠点はありますか? ありがとう Manu –

34

JVMは、最初のヒープレベルでメモリの使用を開始します。 maxheapが高い場合、メモリ要件が現在のメモリを超えているため、maxheapのサイズに拡大します。

ので、

  • -Xms512m -Xmx512m

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

  • -Xms64m -Xmx512m

JVMが64Mで始まるMEM場合、(512の最大天井まで)成長します。要件が64を超えています。

+0

私はそれを知っています。しかし、私の前のコメントで述べたように、「Javaは最初のヒープレベルでメモリ使用量から始まる」とはどういう意味ですか?このメモリは、私の512mバイトのシステムがスワップやスクロールせずにいくつかの他のアプリケーションを起動できるので、私のJavaアプリケーションで数MBしか使用されないため、効果的に割り当てられていないようです。 –

+3

起動時に特定の量のメモリを消費することがわかっている場合は、通常、初期ヒープサイズをより大きな値に設定します。これにより、起動時にJVMが実行時間を取らなくても、ヒープのサイズを何度も変更する必要がなくなります。その特定の使用は、費用のかかる割当てサイクルを避けることによって、より迅速な実行を可能にする非常に一般的な最適化です。 – dhable

+0

この回答をありがとう、この他の質問につながる: Xmsの値をXmxと同じ値に設定することには、「危険」または欠点はありますか? –

5

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

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

JVMが実際にOSからメモリを要求する限り、JVMのプラットフォームと実装に依存していると思います。私はあなたのアプリが実際にそれを必要とするまでメモリを要求しないだろうと想像しています。 -Xmxと-Xmsは単にメモリを予約します。

14

別に標準ヒープパラメータ-Xmsからと-Xmxそれはあなたがヒープ内の他の世代のスペースを持つことができていてもあなたがいる場合、メモリが不足することができますので、パーマ世代空間のサイズを指定するために使用され、-XX:PermSize-XX:MaxPermSizeを知るためにも良いことですあなたのパーマンジェンスペースがいっぱいになります。このリンクには、important JVM parametersの概要もあります。

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バージョンに顕著ポーズは確かにあります。私は短い休止がガベージコレクションの実行であり、長い休止はヒープ割り当てであるということは肯定的です。