01. Что происходит?
Нани, разве Java не управляет памятью автоматически? Как может быть утечка памяти утечка утечка утечка!
Одной из самых мощных функций Java является механизм сборки мусора. Вам не нужно вручную управлять памятью, как в C++, так что вы очень довольны как Java-программист. объекты. . .
Тогда Java автоматически управляет памятью, так как же могут быть утечки памяти?Есть ли ошибка в JVM?Не беспокойтесь и слушайте меня медленно. .
02. Как определить, можно ли его переработать
Давайте сначала разберемся, как JVM определяет, что объект может быть переработан. Обычно есть два способа: один — метод подсчета ссылок, а другой — анализ достижимости.
подсчет ссылок: каждый объект имеет атрибут счетчика ссылок.При добавлении ссылки счетчик увеличивается на 1, а при освобождении ссылки уменьшается на 1. Когда счетчик равен 0, его можно перезапустить.
Этот метод кажется очень простым, но если A ссылается на B, а B ссылается на A, то даже если они больше не используются, они никогда не могут быть переработаны, потому что калькулятор взаимной ссылки=1.
Этот метод прост и не может решить проблему циклической ссылки объектов друг на друга.
Анализ достижимости: Поиск вниз от корней GC, и путь, пройденный поиском, называется цепочкой ссылок. Когда объект не имеет какой-либо цепочки ссылок, связанной с корнями GC, это доказывает, что объект недоступен, и виртуальная машина определяет, что это объект, пригодный для повторного использования.
Анализ достижимости может решить проблему циклических ссылок.
Так что же такое объекты gc root?
- Объекты, на которые есть ссылки в стеке виртуальной машины
- Объект, на который ссылается статическое свойство класса в области метода
- Объект, на который ссылается константа в области метода
- Объекты, на которые ссылается JNI [в общем, Native] в локальном стеке методов
Большинство современных основных виртуальных машин используют анализ достижимости, чтобы определить, может ли объект быть возвращен сборщиком мусора.
03. При каких обстоятельствах произойдет утечка памяти
Поскольку анализ достижимости кажется очень хорошим, то как еще могут быть утечки памяти, давайте взглянем на определение утечек памяти.
Утечка памяти — это когда объект или переменная, которые больше не используются программой, остаются занятыми в памяти.
Возможно, что этот объект больше не используется, но есть другие объекты, которые содержат ссылки на этот объект, что приведет к тому, что GC не сможет повторно использовать этот объект, и в этом случае возникнут утечки памяти.
Напишите программу, которая теряет память
①Долгоживущий объект содержит ссылку на короткоживущий объект, что может привести к утечке памяти.Хотя короткоживущий объект больше не нужен, его нельзя переработать, потому что долгоживущий объект содержит свою ссылку.
public class Simple {
Object object;
public void method1(){
object = new Object();
//...其他代码
}
}
Экземпляр объекта здесь, на самом деле, мы ожидаем, что он будет использоваться только в методе method1(), и он не будет использоваться в других местах, однако при выполнении метода method1() память, выделенная объектным объектом не будет рассматриваться сразу.Это объект, который может быть освобожден.Он будет освобожден только после освобождения объекта, созданного классом Simple.Строго говоря, это утечка памяти.
Решение состоит в том, чтобы сделать объект локальной переменной в методе method1().
public class Simple {
Object object;
public void method1(){
object = new Object();
//...其他代码
object = null;
}
}
Конечно, вы можете подумать, что этот метод не будет иметь большого влияния, но если в некоторых проектах метод вызывается десятки тысяч раз в одну минуту, будут явные утечки памяти.
② Утечки памяти в коллекциях, таких как HashMap, ArrayList и т. д. Эти объекты часто имеют утечки памяти. Например, когда они объявлены как статические объекты, их жизненный цикл будет таким же продолжительным, как и жизненный цикл приложения, и легко может закончиться нехватка памяти.
Ниже приведен пример утечки памяти коллекции.
Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
Object o=new Object();
v.add(o);
o=null;
}
//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。
В этом примере мы циклически применяем объект Object и помещаем примененный объект в вектор.Если мы только отпустим саму ссылку, вектор все еще ссылается на объект, поэтому объект не может быть повторно использован для GC.
Поэтому, если объект должен быть удален из Вектора после того, как он добавлен в Вектор, проще всего установить для объекта Вектора значение null.
Вышеуказанные два являются наиболее распространенными случаями утечки памяти. Конечно, есть и примеры утечек памяти, которые здесь не приводятся, интересующиеся студенты могут найти информацию в Интернете.
04. Утечки памяти и переполнение памяти
Многих студентов всегда смущает разница между утечкой памяти и переполнением памяти, это два совершенно разных понятия, и между ними есть какая-то связь.
недостаточно памяти, что означает, что когда программа обращается за памятью, ей не хватает памяти для использования, и возникает нехватка памяти;
утечка памяти утечка памяти, означает, что программа не может освободить прикладное пространство памяти после подачи заявки на память.Вред утечки памяти можно игнорировать, но накопление утечек памяти имеет серьезные последствия.Независимо от того, сколько памяти, она будет занята рано или поздно.
Таким образом, утечки памяти могут привести к переполнению памяти, но переполнения памяти вызваны не только утечками памяти, но и использованием слишком большого количества больших объектов.
05. Как обнаружить утечки памяти
Последний важный вопрос — как обнаружить утечку памяти в Java. В настоящее время мы обычно используем некоторые инструменты для проверки утечек памяти в программах Java.
На рынке существует несколько профессиональных инструментов для обнаружения утечек памяти Java, и их основные принципы работы схожи, все они заключаются в мониторинге приложений, выпусков и других действий всех объектов во время работы Java-программы, а также всей информации о памяти. управление считается, анализируется и анализируется визуализация. Разработчики будут использовать эту информацию, чтобы определить, есть ли в программе утечки памяти.
Эти инструменты включают Plumbr, Eclipse Memory Analyzer, JProbe Profiler, JVisualVM и другие.
06. Наконец
Приведенный выше контент на самом деле является одним из материалов, у которых я часто брал интервью, задавая ряд вопросов для изучения понимания Java-программистами JVM.
Например, я обычно спрашиваю интервьюеров, есть ли утечки памяти в Java? Большинство людей ответят, что существует, а затем я спрошу, если бы вы написали программу с утечкой памяти, как бы вы ее написали? Большинство программистов не могут ответить.
Если интервьюер сможет ответить на вышеперечисленные вопросы, я потом побеседую с интервьюером, есть ли связь между утечками памяти и переполнением памяти, и как избежать написания кода с утечками памяти в повседневной работе, и есть ли проблемы, связанные с JVM в производстве, идеи и шаги по устранению проблемы и т. д.
На эти вопросы есть ответы в моем блоге, в первые годы я написал серию статей о JVM, если вам интересно, продолжайте читать.www.ityouknow.com/java.html.
Если вы считаете, что удобнее смотреть на мобильном телефоне, то можете обратить внимание на:Технология Java GeekОфициальная учетная запись уже опубликовала несколько статей о JVM, и статьи серии JVM в моем блоге также будут перенесены в эту официальную учетную запись.
Следите за беременностью
Источник ссылки: