今日、意味のあることに気づきましたが、セマンティクスを正確に説明することはできません。
基本的に私は普通の古い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 でのこの種のことに関する優れた記事は素晴らしいでしょう。