长GC循环是否可能导致“连接被拒绝”异常?

时间:2009-11-30 19:23:59

标签: java garbage-collection tcp jvm connection

我们看到ConnectException时连接到我们的Tomcat服务器时偶尔会出现“Connection refused”消息。这可能是由长GC循环造成的吗?

(我们正在激活相关的JVM标志,以便在GC周期中获取更多日志消息,但我想在这里问这个问题)

9 个答案:

答案 0 :(得分:3)

“连接被拒绝”意味着您已到达远程主机,但它确定您不允许连接。如果GC出现问题,则会出现“连接超时”错误。

答案 1 :(得分:2)

了解最佳方法是让您的应用告诉您GC的使用时间。使用选项-verbose:gc启动,您将获得STDOUT的GC扫描记录以及它们的使用时间。更多介绍GC内容is at this summary

答案 2 :(得分:2)

如果没有来自VM的任何监控指标,很难判断,但gc运行并不是不可能导致连接被拒绝,至少是间接的。 可能发生的是,gc run导致每个请求的进程时间增加或请求暂时中断,因此如果客户端的请求模式保持不变,则会增加同时所需连接的数量。

例如,如果您有10个请求/秒并且每个请求需要1秒钟来处理,那么您的服务器至少平均会处理对10个并发连接的支持。如果客户端继续向服务器发出10个请求/秒,但由于某种原因,每个请求需要2秒才能处理而不是1,服务器必须支持20个并发连接或者如果只有较小的数量则开始拒绝连接尝试是允许的。

答案 3 :(得分:1)

我非常怀疑。垃圾收集的运行不会导致您的进程开始拒绝连接 - 如果运行时在GC阶段忙,那么这意味着它目前没有主动运行您的代码。

答案 4 :(得分:1)

我们需要更多相关信息。

这是拒绝连接的Web服务器吗?

多少内存,哪个平台等。

FWIW我在重GC期间看到在CORBA应用程序中拒绝连接。请注意,这与获取连接拒绝消息不同!

答案 5 :(得分:0)

我认为GC绝不会花太多时间网络连接会超时或被拒绝。我非常怀疑这是问题所在。

答案 6 :(得分:0)

这可能但非常非常不可能。如果您认为它是GC,请密切监视从伊甸园到permgen的各种存储空间,特别是它们的行为方式。

如果我必须采取有根据的猜测,我会假设您的连接池耗尽,因为与单个连接相关的实际操作需要很长时间才能执行 - 这些操作将完成< strong>之前甚至回答了初始连接,之后的操作会导致超时。

答案 7 :(得分:0)

如果我没记错的话,如果操作系统有太多已被接受但需要处理的连接,则可能会发生拒绝连接的情况。如果确实如此,Tomcat无法足够快地为套接字提供服务。

我最初的猜测是,你有一些内部持有线程的东西,所以他们无法完成处理。你的线程池足够大吗?你有一个全局同步的对象/方法,一切都需要通过吗?

请详细说明您的情况。

答案 8 :(得分:0)

零星连接拒绝错误通常是由DNS或网络硬件中的打嗝造成的。要解决第一个问题,请尝试使用IP地址而不是主机名。要解决第二个问题,请确保硬件质量高(即电缆没有诀窍,周围没有静电等)。

如果它实际上是由GC引起的(我不相信,使用这样一个完全开发的软件),那么你就不会是唯一遇到这个特定问题的人。

哦,要清楚,正常 连接拒绝错误实际上意味着无法联系到另一方。这通常是由于错误的IP地址,错误的端口,或者网络线路中无法解析的主机名或某些软件/硬件防火墙阻止连接造成的。