Java - Как я могу сделать свое приложение стабильно работающим, чтобы оно не зависало, зависало? - PullRequest
1 голос
/ 23 марта 2012

Мой Java-скелет выглядит примерно так.

, который отлично работает, когда я запускаю его после загрузки системы, в течение пары часов.Так как он работал в течение 24 часов в течение 1 дня, у меня возникли проблемы с моим приложением или самой JVM, такие как проблемы с икотой / зависанием, при печати ничего не происходит, как he is dead.

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

Пример:

public class Boot {

  public static void main(String[] args) {
       String myCmd = "java -cp /var/tmp/dist/App.jar main.main";
       Runtime.getRuntime().exec(myCmd);
       SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            createAndShowGUI();
          }
        });
  }

  private static void createAndShowGUI() {

    new Thread(new Runnable() {
      public void run() {
        //Server port listener
      }
    }).start();

    .....

    window = new JWindow();

    window.add("North", panelBgImg);
    window.pack();
    window.setLayout(new BorderLayout());
    window.setSize(screen.width, screen.height + 1);
    window.setLocationRelativeTo(null);
    window.setAlwaysOnTop(true);
    window.setVisible(true);        
  }
}

Как я могу убедиться, что JVM не вызывает зависание моего приложения?этот?Может ли это помочь решить эту проблему в долгосрочной перспективе?

Например: System.gc () и Runtime.gc ()

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

Если ваше приложение зависает, причина, скорее всего, в некоторой тупиковой ситуации, чем из-за нехватки памяти.В последнем случае JVM просто умирает с исключением.Так что я держу пари, что вызов GC вам здесь не поможет.

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

  • вставьте распечатки журнала отладки в ваш код, чтобы получить больше информации о том, что происходит, а затем проанализируйте журналы, созданные до / во время замораживания вашего приложения
  • остановите JVM (с помощью команды kill или Ctrl + \ из консоли в Linux, Ctrl + Break в Windows), когда ваше приложение заморожено - оно отобразит информацию о дампе потока, перечислив все запущенные и заблокированные потоки
  • Запустите приложение с подключенным VisualVM, чтобы увидеть шаблоны использования памяти
3 голосов
/ 23 марта 2012

Явные обращения к сборщику мусора не решают подобные проблемы.В общем, вы их не используете.Единственное возможное исключение - это когда вы знаете, что освободили много памяти и хотите очистить ее до того, как появится следующая большая задача (но даже этого на самом деле не бывает).чтобы найти, что происходит, нужно запустить visualvm (поставляется с jdk по умолчанию, в bin / dir).Подключитесь к своему приложению и начните смотреть на его память и использование процессора.Если вы подозреваете, что проблема в памяти, вы можете сделать снимки и проанализировать их.

...