В интернете нашёл пример неправильного использования 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()
Утечка памяти у тебя происходи не из-за 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть класс MusicPlayer, у него есть поле List<Music> list , где Music - интерфейс с методом скажиСвоюПесню(), который реализуют три класса
Здрaвcтвуйте! Подскажите пожалуйста, как мне сгруппировать recyclerview? Цифры слева на фото -это семестрыХочу сгруппировать по семестрам
Нужно сравнить значения double c помощью ComparatorМой код:
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском