Java—如何使我的应用程序长期稳定运行,使它不会打嗝、冻结?
我的Java框架如下所示 当我在系统启动后运行它几个小时时,它工作得非常好。由于它运行了一天24小时,我的应用程序或JVM本身出现了问题,比如打嗝/冻结问题,按一下按钮,什么都不会发生,就像他死了一样 这种情况已经发生过好几次了,我猜是内存问题,当它长时间运行时,JVM在某处导致了它,但不是我的应用程序本身,因为最初几个小时它没有停机时间。仅在长时间运行超过8小时时才开始 例如: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
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上使用
命令或在控制台上使用Ctrl+\或在Windows上使用Ctrl+Break),它将显示线程转储信息,列出所有正在运行和死锁的线程kill
- 在连接VisualVM的情况下运行应用程序,查看内存使用模式
- 将调试日志打印输出插入到代码中,以获得更多关于发生了什么的线索,然后分析在应用程序冻结之前/期间生成的日志
- 当你的应用程序被冻结时,停止JVM(在Linux上使用
命令或在控制台上使用Ctrl+\或在Windows上使用Ctrl+Break),它将显示线程转储信息,列出所有正在运行和死锁的线程kill
- 在连接VisualVM的情况下运行应用程序,查看内存使用模式
- 如果你的应用程序冻结,原因很可能是某种死锁,而不是内存不足错误。在后一种情况下,JVM只是在异常情况下死亡。所以我打赌调用GC在这里对你没有帮助
像这样的错误很难准确捕获,因为它们很难可靠地复制。不过,您有几个选择: