web-dev-qa-db-ja.com

JVMのメモリフットプリントとは何ですか?それを最小化するにはどうすればよいですか?

私は、JVMの複数のプロセスを生成し始めたときのJavaVM(Sun、Linux)の実際のフットプリントが何であるかを知りたかっただけです。私がよく覚えているとき、それらはrt.jarを共有する必要があります(そして多分それを超えて?)。それらのJVMはJITキャッシュを共有しますか(すべてのJVMは同じクラスパスを備えています)?

マルチインスタンスJVMのオーバーヘッドを減らすためにできることはありますか? (ヒープの制限を小さく設定する以外に)?

アプリケーションのプログラミング中にできることはありますか?

メモリ領域を共有できますか?たぶん、マップされたメモリブロックを共有しますか?

9
Martin Kersten

この投稿 Javaアプリケーションのフットプリントを構成するものについて説明します。つまり、フットプリントを削減する場合は、これらの部分を削減する必要があります:Javaヒープ、メタスペース、コードキャッシュ、直接バッファ、スレッド数など。

HotSpot JVMのインスタンスは、データを共有するために相互に通信しません。基本的に、それらはOSによって共有されるもの、つまりダイナミックライブラリ(.so)と読み取り専用のメモリマップファイル(.jars)以外は何も共有しません。

IPCメカニズム、たとえばメモリマップトファイルを介してさらに共有を提供するのはアプリケーション次第です。

6
apangin

おそらくそれは部分的な答えにすぎないでしょう。

JVMのメモリフットプリントはどれくらいですか

Javaアプリの完全なフットプリントは、ヒープスペースと非ヒープスペースで構成されます(このように呼びます)。非ヒープスペースに存在するもののほんの数例:PermGenまたはメタスペース、コードからの直接割り当て(malloc)、NIOもネイティブメモリを使用します。

どうすれば最小化できますか?

ヒープは通常、フットプリントの大部分を占めます。それで、私はそれから始めます。

ヒープ以外のスペースについては、PermGen(最大サイズが冗長である場合)、スレッドスタック(特に64ビットJMMでは非常に大きい)、およびコードキャッシュ(もちろんパフォーマンスの指標)を最小限に抑えることができます。

それらのJVMはJITキャッシュを共有していますか

通常の状態(そして私は他の人のことを知りません)では、すべてのプロセスに独自のフットプリントがあります。それが実際にはプロセスとスレッドの違いです。また、複数のJVMに戻ると、各JVMは個別のプロセスです。

rt.jarを共有する必要があります

もちろん、同じディレクトリ(同じインストール)からJavaを開始した場合、それらは同じrt.jarを共有しますが、クラスのソースとしてのみ共有されます。たとえば、Stringクラスは次のようになります。実行中のJVMの数と同じ回数ロードされます。

5
Average Joe

他の回答を補足するために、典型的なJVMメモリフットプリント値とそれらを測定する方法をリストした洞察に満ちた記事をいくつか示します。

https://spring.io/blog/2015/12/10/spring-boot-memory-performance

http://trustmeiamadeveloper.com/2016/03/18/where-is-my-memory-Java/

3
Vadzim