Java—如何使我的应用程序长期稳定运行,使它不会打嗝、冻结?

Java—如何使我的应用程序长期稳定运行,使它不会打嗝、冻结?,java,linux,memory,jvm,ram,Java,Linux,Memory,Jvm,Ram,我的Java框架如下所示 当我在系统启动后运行它几个小时时,它工作得非常好。由于它运行了一天24小时,我的应用程序或JVM本身出现了问题,比如打嗝/冻结问题,按一下按钮,什么都不会发生,就像他死了一样 这种情况已经发生过好几次了,我猜是内存问题,当它长时间运行时,JVM在某处导致了它,但不是我的应用程序本身,因为最初几个小时它没有停机时间。仅在长时间运行超过8小时时才开始 例如: public class Boot { public static void main(String[] ar

我的Java框架如下所示

当我在系统启动后运行它几个小时时,它工作得非常好。由于它运行了一天24小时,我的应用程序或JVM本身出现了问题,比如打嗝/冻结问题,按一下按钮,什么都不会发生,就像他死了一样

这种情况已经发生过好几次了,我猜是内存问题,当它长时间运行时,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不会导致我的应用程序被冻结,是否有必要对此进行单元测试?从长远来看,这有助于解决这个问题吗


e、 g:System.gc()和Runtime.gc()

对垃圾收集器的显式调用不能解决类似的问题。一般来说,你不使用它们。唯一可能的例外是,当您知道您释放了大量内存,并且希望在下一个大任务到来之前将其清理干净时(但即使这样也不会发生)


找到发生的情况的最佳方法是运行visualvm(在bin/dir中带有默认的jdk)。连接到应用程序并开始查看其内存和cpu使用情况。如果这让您怀疑内存是问题所在,您可以拍摄快照并对其进行分析。

对垃圾收集器的显式调用无法解决此类问题。一般来说,你不使用它们。唯一可能的例外是,当您知道您释放了大量内存,并且希望在下一个大任务到来之前将其清理干净时(但即使这样也不会发生)


找到发生的情况的最佳方法是运行visualvm(在bin/dir中带有默认的jdk)。连接到应用程序并开始查看其内存和cpu使用情况。如果这让你怀疑内存有问题,你可以拍摄快照并分析它们。

如果你的应用程序冻结,原因很可能是某种死锁,而不是内存不足错误。在后一种情况下,JVM只是在异常情况下死亡。所以我打赌调用GC在这里对你没有帮助

像这样的错误很难准确捕获,因为它们很难可靠地复制。不过,您有几个选择:

  • 将调试日志打印输出插入到代码中,以获得更多关于发生了什么的线索,然后分析在应用程序冻结之前/期间生成的日志
  • 当你的应用程序被冻结时,停止JVM(在Linux上使用
    kill
    命令或在控制台上使用Ctrl+\或在Windows上使用Ctrl+Break),它将显示线程转储信息,列出所有正在运行和死锁的线程
  • 在连接VisualVM的情况下运行应用程序,查看内存使用模式

    • 如果你的应用程序冻结,原因很可能是某种死锁,而不是内存不足错误。在后一种情况下,JVM只是在异常情况下死亡。所以我打赌调用GC在这里对你没有帮助

      像这样的错误很难准确捕获,因为它们很难可靠地复制。不过,您有几个选择:

      • 将调试日志打印输出插入到代码中,以获得更多关于发生了什么的线索,然后分析在应用程序冻结之前/期间生成的日志
      • 当你的应用程序被冻结时,停止JVM(在Linux上使用
        kill
        命令或在控制台上使用Ctrl+\或在Windows上使用Ctrl+Break),它将显示线程转储信息,列出所有正在运行和死锁的线程
      • 在连接VisualVM的情况下运行应用程序,查看内存使用模式