1

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 から出ることはありません。リストの作成と入力、およびガベージ コレクションの作業など、もう少し多くの作業が必要になりますが、リストは長く続かないため、全体として使用するメモリは少なくなります。

どちらのパターンでも機能するため、この質問は本質的により学術的です。静的リストを保存するとメモリ使用量がわずかに増加し、毎回リストを作成するとワークロードがわずかに増加します。どのパターンを使用するかは、多くの要因 (リストが使用される頻度、アプリのメモリ負荷など) によって異なる可能性があります。どのパターンをターゲットにしますか? また、その理由は?

4

2 に答える 2

4

静的リストを保存すると、メモリ使用量がわずかに増加します

実際に必要がない場合は、より多くのスペースを使用します。使い方が一つでも同じです。ただし、複数のコピーがある場合は、静的バージョンの方が効率的です。

多くの場合、あなたを殺すのは最良のケースではなく、最悪のケースです。最悪の場合、何百万という膨大な数になるでしょう。コレクションのコピーの。

于 2012-09-26T19:10:52.773 に答える
0

Peter Lawrey が指摘しているように、非静的なケースでは、GC が処理を待機している間に、必要以上に多くのメモリを使用することがあります。

私はより読みやすいものに集中します。私にとって、Guava's ImmutableList.ofin a static finalfield は、このデータが変更されないことをすぐに示しています。

(またはCollections.unmodifiableList(Arrays.asList(...))、グアバが必要ない場合)

于 2012-09-26T19:53:14.297 に答える