16

Java (または少なくとも Sun の Hotspot JVM) は、長い間、非常に大きなメモリ フットプリントを持つという評判がありました。JVM にこの評判を与えているのは、正確には何なのでしょうか? 詳細な内訳に興味があります: ランタイムに使用されるメモリの量 (JIT? GC/メモリ管理? クラスローダー?) JNI/JVMTI などの「補助」API に関連するものは? 標準ライブラリ?(どの部品がどれだけ得ますか?) 他の主要なコンポーネントはありますか?

これは、具体的なアプリケーションと VM 構成がないと簡単に答えられない可能性があることを認識しているため、少なくともある程度絞り込むために、主にデフォルト/典型的な VM 構成と、ベースライン コンソールの「Hello world」アプリに関心があります。現実世界のデスクトップやサーバー アプリと同様です。(私は、JVM のフットプリントのかなりの部分がアプリ自体から大きく独立しているのではないかと疑っています。理想的には、この部分を拡大したいと思います。)

他にもいくつかの密接に関連する質問があります。

  • .NET/mono などの他の同様のテクノロジは、ほぼ同じフットプリントを示しません。これはなぜですか?

  • フットプリントの大部分は、単に標準ライブラリのサイズによるものであると、インターウェブのどこかで読んだことがあります。もしそうなら、なぜこれほど多くの標準ライブラリが事前にロードされるのでしょうか?

  • メモリ フットプリントを抑えるための取り組み (JSR など) はありますか? 私が遭遇した最も近いものは、 JVM のディスク上のフットプリントを削減するプロジェクトです。

  • Java の新しいバージョンごとに、過去 10 年ほどの間にフットプリントが変化したことは確かです。JVM のフットプリントがどれだけ変化したかを正確に記録する特定の数値/グラフはありますか?

4

3 に答える 3

7

いくつかのイニシアチブ:

  • 1.5クラスのデータ共有が使用できるため、
  • Java 6 update 14 では圧縮 oopsが導入され、ヒープが 4GB 未満の 64 ビット JVM のフットプリントが削減されました。
于 2009-07-10T07:02:54.657 に答える
5

マルチキャスト トラフィックをブリッジするだけのサーバー側アプリがいくつかあります (つまり、永続的な状態はありません)。それらはすべて、32 ビット Java6 (Linux) JREで約2.3 - 2.5 Mbのヒープで実行されます。

これは大きな足跡ですか?スレッドの観点からは少し無意味ですが、 (メモリの観点から)典型的なサーバー クラスのマシンでこれらを1000個も簡単に持つことができます。

そうは言っても、Java7 で登場する VM (私が信じているライブラリ) をモジュール化するJigsaw プロジェクトがあります。これは、フットプリントを小さくしたい人に役立ちます。

これはあなたの質問に実際には答えていないことを理解していますが、それでも関連性があります! メモリ フットプリントが問題であることがわかっている場合、どのような種類のアプリケーションを設計していますか?

于 2009-07-10T06:34:22.967 に答える
1

少なくとも 1 つのことは、Java の長い歴史です。Java は 1995 年に開始され、現在はバージョン 6 です。機能を追加しながら後方互換性を維持すると、必然的にフットプリントが大きくなります。下の画像はかなりのものを物語っています...

Java 1.1 から Java 6 への JRE サイズの引き上げ

于 2009-07-10T06:48:22.940 に答える