memory-leaks - Tensorflow memory leak - Javaでメモリリークを起こすにはどうすればいいですか? #3

java メモリリークとは / java / memory

Read Question

18 revs, 14 users 33%



Answer #3
public static Map<String, Integer> pseudoQueryDatabase();

次のようなラッパークラスを考えてみましょう。

class EntryHolder {
    Map.Entry<String, Integer> entry;

    EntryHolder(Map.Entry<String, Integer> entry) {
        this.entry = entry;
    }
}
public class LeakTest {

    private final List<EntryHolder> holdersCache = new ArrayList<>();
    private static final int MAP_SIZE = 100_000;

    public void run() {
        //それぞれがTreeMapのエントリへの参照を保持する500のエントリを作成します
        IntStream.range(0, 500).forEach(value -> {
            //マップを作成します
            final Map<String, Integer> map = pseudoQueryDatabase();

            final int index = new Random().nextInt(MAP_SIZE);

            //マップからランダムなエントリを取得します
            for (Map.Entry<String, Integer> entry : map.entrySet()) {
                if (entry.getValue().equals(index)) {
                    holdersCache.add(new EntryHolder(entry));
                    break;
                }
            }
            // visualvmの動作を観察する
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

    }

    public static Map<String, Integer> pseudoQueryDatabase() {
        final Map<String, Integer> map = new TreeMap<>();
        IntStream.range(0, MAP_SIZE).forEach(i -> map.put(String.valueOf(i), i));
        return map;
    }

    public static void main(String[] args) throws Exception {
        new LeakTest().run();
    }
}