утечка памяти статического члена Java - PullRequest
1 голос
/ 05 октября 2011

Я рассматриваю одну базу Java-кодов для обнаружения утечек памяти. В ходе обзора я обнаружил следующие сценарии.

  1. Класс Class1 имеет в кодовой базе. Class1 имеет несколько переменных экземпляра и некоторые статические члены. Некоторые другие классы, создающие экземпляры Class1. Приводит ли этот сценарий к утечке памяти?
  2. Класс Class2 доступен в кодовой базе. У него есть несколько открытых статических внутренних классов. И экземпляр статических внутренних классов создается из других статических внутренних классов. Это приводит к утечке памяти? Например,
Class2 {
  public static class Class3 {
  }
  public static class Class4 {
  }
  public static class Class3 {
      Class3 c = new Class3();
      //….
  }
  public static int doSomething1{
  }
  public static void doSomething2{
  }
  public void doSomething3{
  }

}
* * 1010

Может кто-нибудь дать ответы?

Ответы [ 3 ]

3 голосов
/ 05 октября 2011

Создание экземпляров других классов само по себе не приводит к утечкам памяти.

Удержание ссылок дольше, чем необходимо, приводит к утечкам памяти.

Эти ссылки могут быть явными или неявными. Например: если вы создадите экземпляр нестатического внутреннего класса, он сохранит ссылку на внешний экземпляр, даже если явной ссылки на него не существует.

Таким образом, ответ на ваш прямой вопрос определен: возможно . Вы должны дать нам больше информации.

И еще: довольно хороший инструмент для поиска утечек памяти использует профилировщик. Особенно, если это большая утечка памяти.

1 голос
/ 17 июля 2012

У меня была проблема с утечкой памяти. коллега порекомендовал инструмент для профилирования памяти http://www.eclipse.org/mat/.

Я не мастер Java, даже не близко. Но то, что я сделал, это запустил мой код, отслеживал, когда программа вылетает (нехватка памяти), затем я запускаю код снова, но на этот раз, используя параметр командной строки -Xmx для числа, которое, я знаю, приведет к сбою программы .

Я также добавил -XX:+HeapDumpOnOutOfMemoryError, затем при сбое программы использовал инструмент профилирования и профилировал дамп кучи.

Мне удалось найти нарушающие переменные / объекты. надеюсь, что это помогает, удачи!

1 голос
/ 05 октября 2011

Вообще говоря, статические члены не будут освобождены, пока вы не установите их в null. Переменные экземпляра будут освобождены, если сам экземпляр недоступен. Статические внутренние классы похожи на нормальный класс и поэтому подчиняются правилу выше.

Нестатический внутренний класс описан @Joachim Sauer.

p.s. Научитесь пользоваться профилировщиком, он будет полезен вам до конца вашей жизни в программировании:)

...