多くの文字列操作を行うアプリケーションがあり、メモリに何も格納していないにもかかわらず、jvm メモリの使用量が非常に多いことに気付きました。
問題を示すためにサンプルアプリケーションを作成しました:ボタンが1つある単純なJFrameがあります
private void buttonDoWorkActionPerformed(java.awt.event.ActionEvent evt) {
String randomString = "abc test garbagecollector";
ArrayList<String> results;
for(int i=0; i<100000; i++)
results = doNothing(randomString.split(" "));
results = null;//No effect
System.gc();//No effect
}
private static ArrayList<String> doNothing(String[] words) {
ArrayList<String> results = new ArrayList<String>();
for (String word : words)
results.add(word);
return results;
}
このサンプルを実行すると、JVM はメモリ内で約 50Mo を使用し、ボタンを押すと 150Mo に上昇し、決してダウンすることはありません。編集:Windowsタスクマネージャーの「java.exe」プロセスを参照しています。
明らかに、私は多くの一時的な文字列のコピーを行っていますが、参照が失われると、それらがカーベージ コレクターによって解放されることを期待しています。
編集:関係ないかもしれませんが、Java 1.6 で 32 ビット バージョンと 64 ビット バージョンの両方を試しました。