3

今日、意味のあることに気づきましたが、セマンティクスを正確に説明することはできません。

基本的に私は普通の古いJavamainメソッドを作成し、その中に決して終わらないwhileループがあります。このループでは、いくつかの文字列を作成し、それらを HashMap に配置します。私が本当に欲しいのは、一定期間にわたってメモリ使用率を実行して構築するプロセスだけです。

public class Test {

public static void main(String[] args) throws InterruptedException {
    final HashMap<String, String> names = new HashMap<String, String>();
    while(true) {
        names.put(new Date().toString(), "lskjflksjdflksjdflkjsieurlskjflksn,kdsgkjsdlkfjslkdjfs");
        Thread.sleep(50);
    }
}

}

プロセスは で開始され-Xms512m -Xmx512mます。

開始したらprocexp.exe、Java プロセスを表示するために使用できます。私が理解しようとしているビットは、仮想メモリと物理メモリです。仮想メモリ (プライベート バイト) は、要求された jvm サイズ、つまり 512MB にマップされているようです。時間の経過に伴うプロセスのプロファイルから、プロセスがより多くの文字列値を生成してマップを埋めるにつれて、物理メモリ (ワーキング セット) がプロセスによって使用されている実際のメモリであると想定しています。常に 512MB よりもずっと小さいです。

私の質問は、なぜ Java が仮想メモリを使用しているのかということです。

それはすべてRAM、つまり物理メモリにありませんか?

仮想メモリを使用しているため、ディスクにスワップしているということですか?

それはパフォーマンスに悪いですか?

パフォーマンスを向上させるために、すべてを強制的にRAMに配置する方法はありますか?

Windows でのこの種のことに関する優れた記事は素晴らしいでしょう。

4

2 に答える 2

2

Java が仮想メモリを使用するのはなぜですか?

すべてのユーザー アプリケーションは、仮想メモリを使用して OS メモリと対話します。これを(ページテーブルを介して)物理RAM /ディスクにマップするのはOS次第です。-Xms512m で JVM を起動したため、起動時に 500 MB の仮想メモリ スペースが要求されますが、OS は 500 MB の物理 RAM を予約しないことを選択します。

それはすべてRAM、つまり物理メモリにありませんか?

マシンがすべての物理 RAM を高い割合 (>75% 程度) で使用しており、JVM ベースのアプリがそのデータの一部に最近アクセスした場合を除き、JVM はすべて RAM 内にあります。

仮想メモリを使用しているため、ディスクにスワップしているということですか?

いいえ。上記を参照してください。

それはパフォーマンスに悪いですか?

データがディスクにページングされるアプリでは、ページングは​​パフォーマンスに悪影響を与える可能性があります。Windows は、いくつかの方法でこの影響を最小限に抑えようとします。

  1. ディスクに送信される仮想メモリ ページは、使用頻度が最も低いページです。
  2. ページがすぐに使用されることを Windows が検出できる場合にディスクからページを引き戻すように設計された最適化がいくつかあります (つまり、マップ内のキーを反復処理し始めると、Windows は、反復がそれらに達する前の次のキーのブロック)

また、前述したように、ほとんどの場合、ディスクへのページングは​​行われていません。

パフォーマンスを向上させるために、すべてを強制的にRAMに配置する方法はありますか?

Windows でページ ファイルをオフにすることができます。 手順が記載された Youtube ビデオを次に示します。

Windows でのこの種のことに関する優れた記事は素晴らしいでしょう。

于 2013-02-04T21:22:19.103 に答える
1

32 ビット コンピューター上のすべてのプロセスに対して、アドレス指定可能なメモリは 4 GB です。コンピューターに実際に 4 GB の実際の RAM メモリがあるかどうかは重要ではありません。

たとえば、コンピュータに 2 GB の RAM がある場合、JVM からは 4 GB のメモリがあるように見えます。残りの 2GB のメモリは、メモリを HDD 内のファイルにマッピングすることによって得られます (これは仮想メモリです)。

複数のプロセスが実行されている場合、各プロセスは、コンピューター上で実行されている唯一のプロセスであり、4 GB のアドレス指定可能なメモリが割り当てられているように見えます。実行中のプロセスは JVM だけではないため、オペレーティング システムのメモリ マネージャは、未使用のメモリの内容を仮想メモリ ファイルにプッシュすることを決定する場合があります。これはOSが決定します。

ディスクにスワップしているため、パフォーマンスの遅延が顕著になります (ソリッド ステート ハード ドライブでない限り)

于 2013-02-04T21:20:17.097 に答える