2016-06-07 129 views
0

我的java桌面应用程序(使用netbean开发)在运行很长时间(大约10个小时)时处于挂起状态。当JAVA桌面应用程序挂起时应该怎么做?

我的应用程序的目的是将SOAP Web服务调用到企业系统。 所以,执行总是需要很长时间。

但是在第一个1-4小时内,它工作得很好。

运行10小时以上时总会出现此问题。

下面我已经完成了一些步骤。

  1. 使用log4j记录所有异常消息。 (因为我认为它可能会导致网络连接,数据库连接等)。

  2. 每次都在循环语句中调用System.gc()(因为我认为它运行很长时间,它不会释放资源回到系统,所以我强制它调用垃圾回收器)。

我曾尝试和测试,在任何情况下该异常可偏偏如

  1. 网络连接断开。
  2. 连接超时。
  3. 企业发回消息为500内部错误(以及所有http错误)
  4. SOAP消息的XML格式无效。
  5. 解析XML时失败
  6. 与数据库的连接无法建立。
  7. 无效的SQL语句。
  8. 数据库中字段的数据类型无效。

每个异常都会被log4j捕获并能够继续运行。

但是,这在第1 - 4小时内运作良好。达到10小时时。它被吊死了。没有日志。没有信息。

我用JAVA JDK 1.8,MySQL数据库5.5.4,Windows服务器2008 R2 64位

能否请您帮忙建议我缺少的是什么斑或点?

还有什么我应该关心和检查的?

最好的问候,

+0

你分配你的Java应用程序有多少内存?内存使用量会随着时间增加吗?尝试设置更高或更低的XMX并查看它是否会影响崩溃需要多长时间。如果发生这种情况,那么你将有一个地方开始,并可以运行在你可能绑定资源的情况下。 – sorifiend

+0

@sorifiend此应用程序的内存分配大约3GB。 我在任务管理器中监视并查看javaw.exe进程(我的应用程序)只消耗〜170 MB。 :( –

回答

0

简单的答案:DEBUG,添加大量的日志/调试。

只使用使用log4j的检查错误,但您的应用程序显然是其他地方挂的log4j有机会做一个日志之前,所以不是我建议你做的两件事情之一:

1)创建一个检查应用程序状态的新线程(您显然需要将部分代码暴露给该线程并定期检查它)。

2)更简单的选择是添加大量的调试代码以将所有内容记录到文件中,然后当应用程序挂起时,通过检查日志文件很容易看出最后一个操作是什么,并且可能确切地知道是什么引起了这个问题因此,个人而言,只是记录错误,我会在处理以下任何内容之前创建一个日志:传入连接,超时,调用数据库,http错误以及几乎任何其他重大事件,并且我还会在所有以下已被处理。这样当应用程序挂起时,只需查找尚未完成的任何进程,然后通过添加更多调试/日志记录就可以开始调查为什么会发生这种情况。

一旦你解决了问题,别忘了提炼或删除所有的调试代码,否则你可能会遭受一些性能损失,除非你在不同的线程中完成。