2016-07-04 24 views
3

私はJavaアプリケーションを書いており、Fedora 24の下でjavaプロセスを実行しました。次にjconsoleをチェックして、約5〜10メガバイトのメモリを使用していることがわかりました。 ガベージコレクションの効果もグラフに表示されます。ここでなぜこのJavaプロセスはメモリを解放しないのですか?

はスクリーンショットです: jconsole screenshot

それから私は私のシステムモニタをチェックし、同じプロセスIDが以上100メガバイトのメモリ使用量を持っていることが分かりました。ここで

はスクリーンショットです:プロセスが未使用のメモリを解放しない理由

System Monitor screenshot

を教えてください?

これを解放する方法はありますか?

+1

このJavaアプリケーションとは何ですか?スイング? –

+0

@CoderinoJavarino no。名前はタイトルとテキストに表示されます。 –

+0

なぜ気にしますか?これはintellij、非常に大きなJavaベースのプログラムです。表示されている2つ以上のプロセスでChromeの処理能力が100MBを超えているという苦情はありません。 100MBはあまりメモリではありません.Gnomeの処理にはそれ以上の時間がかかります。あなたが本当に問題を抱えているなら、それを私たちに知らせてください。 100MBのメモリはもう何もありません。 – stdunbar

答えて

1

後にすべての過剰ヒープを保持することを可能にします。グラフの青い線は、実際にオブジェクトを保持しているヒープの量です。表示されていないものは、割り当てられているヒープのサイズです。これは大きく、しばしばはるかに大きいので、JVMはスペースを使い果たすことなく多くのオブジェクトを割り当てることができ、 )。あなたのケースでは、システムが表示している100MBのうちのいくつかはJVM自体ですが、そのほとんどは割り当てられているが使用されていないヒープである可能性があります。

ヒープサイズを指定せずにJavaプログラムを実行すると、JVMはマシン、OS、JVMのバージョンなどに基づいて適切な設定を見つけようとします。単純なHello Worldを実行すると私のマシンは16GBのRAMとJava 8で、最初はヒープ用に256MBを割り当てました。明らかにそれ以上のものが必要です!これを少なくするように強制する場合は、-Xmsコマンドラインを使用して初期ヒープ割り当てを設定し、-Xmxを使用して最大許容値を設定することができます。私の推測では、-Xms20mのようなものを設定すると、あなたのプロセスで使用されているメモリが少なくなると思います。 IntelliJで、この設定を実行コンフィギュレーションのVM Optionsフィールドに追加します。

2

システムモニタで報告されるメモリは、Javaヒープだけでなく、プロセスで使用されるすべてのメモリです。 VM自体の

  • 実行ファイル、およびライブラリは、それがホットスポットコンパイラ、GC、IOのようなもので使用するためのプロセスとしてVM ため
  • の作業スペースをロードしています。このメモリは、バッファ、画面とグラフィックバッファは、VMのファイルなど
  • Javaヒープおよびその他の報告のメモリ構造、あなたの場合は

を読んで、プロセスの10メガバイトは、JavaスタックとJavaオブジェクトを格納するために使用されています。もう一方の90MBは、Javaプログラム自体と、VM内部のメモリです。

これは簡単な答えですが、もう1つの重要な考慮事項があります。Javaでは過剰なヒープをOSに戻すことができます。これは、-XX:MinHeapFreeRatioとフラグによって制御されます。デフォルトでは、MaxHeapFreeRatioは70%です。これはHeapグラフ(6MBから10MB未満の鋸歯パターン)に表示されるものとほとんど同じです。あなたのアプリのドロップが大幅に大きくなった場合、システムモニタでJavaプロセスの(僅か)鋸歯模様が表示されます。

パフォーマンスを向上させるには、一般に、JVMがGCから解放されたヒープのかなりの部分を保持できるようにする必要があります。どうして? JVMが即座にメモリの割り当てを開始する必要があることがわかっているため、Javaのプロセス(およびOS)がこれを保持する方が効率的です。要約中のSO

、:システムモニタは、全体のJVMプロセス

  • によって使用されるメモリを示し

    • Javaヒープは、それは(一つだけのメモリを使用してアイテムの過程で
    • です一般的に)JVMがGCの後に解放するヒープを保持する(少なくともいくつかの)パフォーマンスは、次の数秒以内にこれをほぼ確実に使用するためです。
    • この場合のJavaヒープは、通常の境界、およびデフォルトのメモリ構成sの場合は、ヒープを使用し、ヒープを割り当てとの差があり、JavaがGC
  • 関連する問題