утечка памяти - это тип утечки ресурсов, который возникает, когда компьютерная программа неправильно управляет выделением памяти таким образом, что память, которая больше не нужна, не освобождается => определение вики
Это своего рода относительно контекстная тема, вы можете просто создать ее по своему вкусу, если неиспользованные ссылки никогда не будут использоваться клиентами, но будут оставатьсяжив.
Первый пример должен быть пользовательским стеком без обнуления устаревших ссылок в эффективного элемента Java 6 .
КонечноЕсть еще много, сколько вы хотите, но если мы просто посмотрим на встроенные классы Java, это может быть что-то вроде
subList()
Давайте проверим супер глупый код, чтобы произвести утечку.
public class MemoryLeak {
private static final int HUGE_SIZE = 10_000;
public static void main(String... args) {
letsLeakNow();
}
private static void letsLeakNow() {
Map<Integer, Object> leakMap = new HashMap<>();
for (int i = 0; i < HUGE_SIZE; ++i) {
leakMap.put(i * 2, getListWithRandomNumber());
}
}
private static List<Integer> getListWithRandomNumber() {
List<Integer> originalHugeIntList = new ArrayList<>();
for (int i = 0; i < HUGE_SIZE; ++i) {
originalHugeIntList.add(new Random().nextInt());
}
return originalHugeIntList.subList(0, 1);
}
}
На самом деле есть еще одна хитрость, которую мы можем вызвать утечку памяти, используя HashMap , воспользовавшись преимуществами его процесса поиска.На самом деле существует два типа:
hashCode()
всегда одинаковы, но equals()
различны; - используют random
hashCode()
и equals()
всегда верно;
Почему?
hashCode()
-> ведро => equals()
, чтобы найти пару
Я собирался упомянуть сначала substring()
, а затем subList()
, но, похоже, эта проблема уже исправлена, поскольку ее источник представлен в JDK 8.
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
}
int subLen = endIndex - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return ((beginIndex == 0) && (endIndex == value.length)) ? this
: new String(value, beginIndex, subLen);
}