10

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

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

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

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

4

3 に答える 3

6

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

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

IPC メカニズム (メモリ マップ ファイルなど) を介してさらに共有するかどうかは、アプリケーション次第です。

于 2016-07-24T13:36:58.770 に答える
5

おそらくそれは部分的な答えにすぎません。

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

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

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

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

非ヒープ領域に関しては、最小化できます: PermGen (最大サイズが冗長な場合)、スレッド スタック (特に 64 ビット JMM では非常に大きい)、およびコード キャッシュ (もちろん、パフォーマンスのために)。

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

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

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

もちろん、同じディレクトリ (同じインストール) から Java を起動すると、それらは同じ rt.jar を共有しますが、それはクラスのソースとしてのみです。たとえば、String クラスは、実行中の JVM の数だけロードされます。

于 2016-07-24T13:33:48.453 に答える
4

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

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

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

于 2016-09-12T17:03:39.887 に答える