Как устроен static class

201
15 апреля 2022, 22:30

В интернете нашёл пример неправильного использования ThreadLocal переменной и внутренних классов.

 class X {
  ThreadLocal<Anchor> local = new ThreadLocal<Anchor>();
  class Anchor {
    byte[] data = new byte[1024 * 1024];
  }
  public Anchor getOrCreate() {
    Anchor res = local.get();
    if (res == null) {
      res = new Anchor();
      local.set(res);
    }
    return res;
  }
  public static void doLeakOneMoreInstance() {
    new X().getOrCreate();
  }
  public static void main(String[] args) throws Exception {
    while (true) {
      doLeakOneMoreInstance();
      System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024 + " MB of heap left");
    }
  }
}

Если объявить статиком class Anchor почему не происходит утечка памяти? Я всегда считал что статик класс объявляется для удобства создания класса например чтобы не делать так a.new B(), а делать вот так new A.B()

Answer 1

Утечка памяти у тебя происходи не из-за Anchor А из-за того что ты в цикле while каждый раз создаешь новый объект X в котором создаётся новый объект Anchor

Вот если использовать объект X только один, никакой утечки нет

class X {
    ThreadLocal<Anchor> local = new ThreadLocal<Anchor>();
    class Anchor {
        byte[] data = new byte[1024 * 1024];
    }
    public Anchor getOrCreate() {
        Anchor res = local.get();
        if (res == null) {
            res = new Anchor();
            local.set(res);
        }
        return res;
    }
    public static void doLeakOneMoreInstance(X xObject) {
        xObject.getOrCreate();
    }
    public static void main(String[] args) throws Exception {
        X xObject = new X(); // используем один единственный X
        while (true) {
            doLeakOneMoreInstance(xObject);
            System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024 + " MB of heap left");
        }
    }
}

А когда ты делаешь статик класс Anchor, то просто не создаётся новый экземпляр. А так у тебя в ThreadLocal просто плодится бесконечно много объектов Anchor

READ ALSO
Как лучше всего вывести List &lt;Music&gt; list, где Music - это интерфейс?

Как лучше всего вывести List <Music> list, где Music - это интерфейс?

Есть класс MusicPlayer, у него есть поле List<Music> list , где Music - интерфейс с методом скажиСвоюПесню(), который реализуют три класса

203
Группировка RecyclerView Android

Группировка RecyclerView Android

Здрaвcтвуйте! Подскажите пожалуйста, как мне сгруппировать recyclerview? Цифры слева на фото -это семестрыХочу сгруппировать по семестрам

151
Java Comparator : possible lossy conversion from double to int

Java Comparator : possible lossy conversion from double to int

Нужно сравнить значения double c помощью ComparatorМой код:

249
Создание нового проекта Java Enterprise Intellij idea [закрыт]

Создание нового проекта Java Enterprise Intellij idea [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

174