如果修改了网络,Java应用程序将挂起

时间:2009-10-31 08:59:45

标签: java eclipse caching networking

我正在开发一个有多个视图的eclipse应用程序。从这些视图中我必须通过线路访问一些数据。以下情况会引发错误。

第1步:启动应用,一切正常 第2步:禁用网络
第3步:启用网络
第4步:尝试从其中一个视图通过线路访问数据。该应用程序显然挂起。
第5步:现在,如果您尝试从其他视图访问数据,一切正常。

最初我认为它是由于JVM的DNS缓存而发生的。所以我做了类似的事。

System.setProperty( "networkaddress.cache.ttl", "0" );
System.setProperty( "networkaddress.cache.negative.ttl" , "0" );

但问题仍然存在。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

完全狂野猜测:如果您使用TCP,您的应用可能没有注意到它的套接字已断开连接。如果它在读取中被阻止,它可能不会注意到它尝试向套接字写入内容。这取决于套接字关闭的“干净” - 如果套接字没有从另一端获得RST数据包,它将不知道另一端已经消失。

您可以尝试从您的应用中强制转出线程转储。通常,JVM将在终端运行时响应 Ctrl - \ ,或者响应每个线程的堆栈跟踪的kill -QUIT信号。这可以让你看到有问题的线程被阻止的位置。

如果您可以发布一些可疑代码,那么尝试进行诊断要容易得多。或者你能解释为什么你认为DNS缓存会成为问题吗?

答案 1 :(得分:0)

它可能在第2步和第3步之间。抛出了什么类型的异常?

答案 2 :(得分:0)

当您的应用程序挂起时,查看当前堆栈的另一个选项是使用jps / jstack(与以1.5开头的Sun JDK捆绑)或visualvm(在1.6 SDK中提供,与https://visualvm.dev.java.net/分开)

jps列出了计算机上所有当前的java进程。然后,您可以使用每个进程ID调用jstack来获取当前堆栈。

也许如果你能发布这样的堆栈跟踪,我们可以提供帮助。