Java - Как мога да направя приложението си дълготрайно стабилно, така че да не хълца, замръзва?

Моят 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 ()


person Community    schedule 23.03.2012    source източник


Отговори (2)


Ако приложението ви замръзне, причината е по-вероятно някакъв вид блокиране, отколкото грешка при липса на памет. В последния случай JVM просто умира с изключение. Обзалагам се, че извикването на GC няма да ви помогне тук.

Грешки като тази са трудни за точно улавяне, защото е много трудно да се възпроизведат надеждно. Все пак имате няколко опции:

  • вмъкнете разпечатки на журнал за отстраняване на грешки в кода си, за да получите повече представа за случващото се, след което анализирайте журналите, създадени преди / по време на замразяването на приложението ви
  • спрете JVM (с командата kill или Ctrl+\ от конзолата на Linux, Ctrl+Break на Windows), когато приложението ви е замразено - то ще покаже информация за изхвърляне на нишка, изброявайки всички работещи и блокирани нишки
  • стартирайте приложението си с прикачен VisualVM, за да видите моделите на използване на паметта
person Péter Török    schedule 23.03.2012

Изричните извиквания към събирача на отпадъци не решават проблеми като този. По принцип не ги използвате. Единственото възможно изключение е, когато знаете, че сте освободили много памет и искате да я почистите, преди да дойде следващата голяма задача (но дори това никога не се случва).

Най-добрият начин да разберете какво се случва е да стартирате visualvm (идва с jdk по подразбиране, в bin/dir). Свържете се с вашето приложение и започнете да разглеждате неговата памет и използване на процесора. Ако това ви кара да подозирате, че проблемът е в паметта, можете да направите моментни снимки и да ги анализирате.

person Thirler    schedule 23.03.2012