HotSpot JVM が使用する世代別ガベージ コレクションがどのように機能するかを理解しています。次の行に沿って、静的データのリストを返すメソッドがあります。
public List<String> getList() {
List<String> ret = new ArrayList<String>();
ret.add("foo");
ret.add("bar");
return ret;
}
私はこれを次のように書き直すことを考えていました
private static List<String> list = null;
...
public List<String> getList() {
if (list == null) { .. initialize here .. }
return list;
}
これにより、リストが一度だけ作成されます。この単一のリスト インスタンスは、最終的には、Tenured 世代に組み込まれます。これはかなり大きなアプリであるため、多くの場所でこの設計パターンを使用すると、Tenured 世代にこれらの静的リストが多数存在することになり、アプリのメモリ使用量が増加します。
毎回新しいリストを作成して返すというパターンに従えば、そのリストはガベージ コレクションされる前に決して Eden から出ることはありません。リストの作成と入力、およびガベージ コレクションの作業など、もう少し多くの作業が必要になりますが、リストは長く続かないため、全体として使用するメモリは少なくなります。
どちらのパターンでも機能するため、この質問は本質的により学術的です。静的リストを保存するとメモリ使用量がわずかに増加し、毎回リストを作成するとワークロードがわずかに増加します。どのパターンを使用するかは、多くの要因 (リストが使用される頻度、アプリのメモリ負荷など) によって異なる可能性があります。どのパターンをターゲットにしますか? また、その理由は?