言葉遣いのためにかなり大きな編集を編集し、全体に詳細を追加します。
いくつかの考え:
ホットスポットは、コードの一部が他の部分よりも大幅に多く実行されているときに開始されます(プログラムのホットスポットです)。これにより、そのコードはその時点から(通常のパスの場合)大幅に高速になります。ホットスポットのコンパイル後の呼び出し率は重要ではないので、これがあなたが言及している効果を引き起こしているとは思わない。
効果は本当ですか?統計で自分をだますのはとても簡単です。あなたがそうだと言っているわけではありませんが、すべての実行が結果に含まれていること、および他のすべての効果(他のプログラム、アクティビティ、監視プログラムなど)がすべての場合に同じであることを確認してください。 topなどのプログラムは、動作に違いをもたらします)。ある場合、データベースのキャッシュがウォームアップすると、アプリケーションのパフォーマンスが大幅に向上しました。同じDBインスタンス上の他のアプリケーションからのメモリ不足がありました。
オペレーティングシステムやCPUが関係している可能性があります。OSとCPUは、メインプログラムが主に実行中から主にI / Oの待機中、またはその逆に移行するときに、メインプログラムの応答性を向上させるために、アクティブとパッシブの両方で次のようなことを行います。
- OSは、使用されていないときはメモリをディスクにページングし、プログラムの実行中はRAMに戻します。
- OSは頻繁に使用されるディスクブロックをキャッシュします。これにより、アプリケーションのパフォーマンスが向上する可能性があります。
- CPU命令とメモリキャッシュは、アクティブなプログラムの命令とデータでいっぱいになります
次の理由により、メモリページングの影響に特に敏感なJavaアプリケーション。
- 一般的なJavaアプリケーションサーバーは、ほとんどすべての空きメモリをJavaに事前に割り当てます。大きなメモリにより、アプリケーションは本質的にメモリ効果に対してより敏感になります
- Javaメモリの管理に使用される世代別ガベージコレクタは、最終的に多くのページにわたって新しいオブジェクトを作成するため、アプリケーションへの各リクエストには、他の言語よりも多くのページリクエストが必要になります。(これは主に、多くのガベージコレクションを通過していない「新しい」オブジェクトに当てはまります。永続世代にプロモートされたオブジェクトは、実際には非常にコンパクトに格納されます)
- 使用可能なほとんどの物理メモリがシステムに割り当てられているため、常にメモリに負荷がかかります。最も大きく、最も最近実行されていないアプリケーションは、ページアウトするのに最適な候補です。
これらの考慮事項を考慮すると、メモリ要件が小さい環境よりも、ページミスが発生し、パフォーマンスが低下する可能性がはるかに高くなります。これらは、Javaがしばらくアイドル状態になった後に特に明らかになります。
SolarisまたはMacを使用している場合、優れたdTraceは、アプリケーションに固有のメモリとディスクのページングをトレースできます。JVMには、ページ監視を開始および停止するためのトリガーとして使用できる多数のdTraceフックがあります。
Solarisでは、大きなメモリページ(サイズが1GBを超える場合でも)を使用してRAMに固定できるため、ページアウトされることはありません。これにより、上記のメモリページの問題が解消されます。ディスクキャッシングおよびその他のシステム/メンテナンス/バックアップ/管理アプリ用に、十分な空きメモリを残すことを忘れないでください。他のOSも同様の機能をサポートしていると思います。
TL / DR: OSがプログラムとデータページをディスクから戻し、頻繁に使用するディスクページをディスクキャッシュに配置し、OS命令とデータキャッシュが実行されるため、最新のオペレーティングシステムで現在実行中のプログラムは数秒後に高速に実行されるように見えます。メインプログラムでは「暖かい」傾向があります。この効果はJVMに固有のものではありませんが、一般的なJavaアプリケーションのメモリ要件とガベージコレクションのメモリモデルにより、より顕著になります。