- 浏览: 34943 次
- 性别:
- 来自: 大连
-
最新评论
-
qufulin:
活用ajax,如何发送异步请求我就不给你说了, 我这给你贴段使 ...
如何通过代码实现查看网页源程序 -
Komes:
zhangdaiping 写道啥也不说了,上个图给楼主看。
先 ...
如何通过代码实现查看网页源程序 -
zhangdaiping:
啥也不说了,上个图给楼主看。
如何通过代码实现查看网页源程序 -
iamsk:
做个记号,赞
到底传值还是传引用 -
yuankai:
我也说一个吧。在写Blog的时候,如果有附件,而且附件比较大的 ...
javaeye让人多少有些不爽的bug们
在网络编程中,特别是在短时间内new的网络连接太多,经常出现java.net.BindException: Address already in use: JVM_Bind的异常,网络有很多介绍此异常的,通常都是在说是要使用的端口被别的程序已经使用,但有时并不是这个原因,通过仔细查找,找到一些很好的资料,在此将其一一记录下来。
**********************************************************************************
文章一
短时间内new socket操作过多
而socket.close()操作并不能立即释放绑定的端口
而是把端口设置为TIME_WAIT状态
过段时间(默认240s)才释放(用netstat -na可以看到)
最后系统资源耗尽
(windows上是耗尽了pool of ephemeral ports 这段区间在1024-5000之间)
Socket FAQ:
Remember that TCP guarantees all data transmitted will be delivered,
if at all possible. When you close a socket, the server goes into a
TIME_WAIT state, just to be really really sure that all the data has
gone through. When a socket is closed, both sides agree by sending
messages to each other that they will send no more data. This, it
seemed to me was good enough, and after the handshaking is done, the
socket should be closed. The problem is two-fold. First, there is no
way to be sure that the last ack was communicated successfully.
Second, there may be "wandering duplicates" left on the net that must
be dealt with if they are delivered.
Andrew Gierth (andrew@erlenstar.demon.co.uk) helped to explain the
closing sequence in the following usenet posting:
Assume that a connection is in ESTABLISHED state, and the client is
about to do an orderly release. The client's sequence no. is Sc, and
the server's is Ss. Client Server
====== ======
ESTABLISHED ESTABLISHED
(client closes)
ESTABLISHED ESTABLISHED
RESOLUTION
Warning Serious problems might occur if you modify the registry incorrectly by using Registry Editor or by using another method. These problems might require that you reinstall your operating system. Microsoft cannot guarantee that these problems can be solved. Modify the registry at your own risk.
The default maximum number of ephemeral TCP ports is 5000 in the products that are included in the 'Applies to' section. A new parameter has been added in these products. To increase the maximum number of ephemeral ports, follow these steps:
1.
Start Registry Editor.
2.
Locate the following subkey in the registry, and then click Parameters:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
3.
On the Edit menu, click New, and then add the following registry entry:
Value Name: MaxUserPort
Value Type: DWORD
Value data: 65534
Valid Range: 5000-65534 (decimal)
Default: 0x1388 (5000 decimal)
Description: This parameter controls the maximum port number that is used when a program requests any available user port from the system. Typically , ephemeral (short-lived) ports are allocated between the values of 1024 and 5000 inclusive.
4.
Quit Registry Editor.
Note An additional TCPTimedWaitDelay registry parameter determines how long a closed port waits until the closed port can be reused.
原文连接:
http://blog.chinaunix.net/u/29553/showart_450701.html
**********************************************************************************
文章二
java.net.BindException: Address already in use: connect的问题
大概原因是短时间内new socket操作很多,而socket.close()操作并不能立即释放绑定的端口,而是把端口设置为TIME_WAIT状态,过段时间(默认240s)才释放,(用netstat -na可以看到),最后系统资源耗尽(windows上是耗尽了pool of ephemeral ports ,这段区间在1024-5000之间; )
避免出现这一问题的方法有两个,一个是调高你的web服务器的最大连接线程数,调到1024,2048都还凑合,以resin为例,修改resin.conf中的thread-pool.thread_max,如果你采用apache连resin的架构,别忘了再调整apache;
另一个是修改运行web服务器的机器的操作系统网络配置,把time wait的时间调低一些,比如30s。
在red hat上,查看有关的选项,
[xxx@xxx~]$ /sbin/sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
[xxx@xxx~]$vi /etc/sysctl,修改
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
[xxx@xxx~]$sysctl -p,使内核参数生效
socket-faq中的这一段讲time_wait的,摘录如下:
2.7. Please explain the TIME_WAIT state.
Remember that TCP guarantees all data transmitted will be delivered,
if at all possible. When you close a socket, the server goes into a
TIME_WAIT state, just to be really really sure that all the data has
gone through. When a socket is closed, both sides agree by sending
messages to each other that they will send no more data. This, it
seemed to me was good enough, and after the handshaking is done, the
socket should be closed. The problem is two-fold. First, there is no
way to be sure that the last ack was communicated successfully.
Second, there may be "wandering duplicates" left on the net that must
be dealt with if they are delivered.
Andrew Gierth (andrew@erlenstar.demon.co.uk) helped to explain the
closing sequence in the following usenet posting:
Assume that a connection is in ESTABLISHED state, and the client is
about to do an orderly release. The client's sequence no. is Sc, and
the server's is Ss. Client Server
====== ======
ESTABLISHED ESTABLISHED
(client closes)
ESTABLISHED ESTABLISHED
------->>
FIN_WAIT_1
>
TIME_WAIT CLOSED
(2*msl elapses...)
CLOSED
Note: the +1 on the sequence numbers is because the FIN counts as one
byte of data. (The above diagram is equivalent to fig. 13 from RFC
793).
Now consider what happens if the last of those packets is dropped in
the network. The client has done with the connection; it has no more
data or control info to send, and never will have. But the server does
not know whether the client received all the data correctly; that's
what the last ACK segment is for. Now the server may or may not care
whether the client got the data, but that is not an issue for TCP; TCP
is a reliable rotocol, and must distinguish between an orderly
connection close where all data is transferred, and a connection abort
where data may or may not have been lost.
So, if that last packet is dropped, the server will retransmit it (it
is, after all, an unacknowledged segment) and will expect to see a
suitable ACK segment in reply. If the client went straight to CLOSED,
the only possible response to that retransmit would be a RST, which
would indicate to the server that data had been lost, when in fact it
had not been.
(Bear in mind that the server's FIN segment may, additionally, contain
data.)
DISCLAIMER: This is my interpretation of the RFCs (I have read all the
TCP-related ones I could find), but I have not attempted to examine
implementation source code or trace actual connections in order to
verify it. I am satisfied that the logic is correct, though.
More commentarty from Vic:
The second issue was addressed by Richard Stevens (rstevens@noao.edu,
author of "Unix Network Programming", see ``1.5 Where can I get source
code for the book [book title]?''). I have put together quotes from
some of his postings and email which explain this. I have brought
together paragraphs from different postings, and have made as few
changes as possible.
From Richard Stevens (rstevens@noao.edu):
If the duration of the TIME_WAIT state were just to handle TCP's full-
duplex close, then the time would be much smaller, and it would be
some function of the current RTO (retransmission timeout), not the MSL
(the packet lifetime).
A couple of points about the TIME_WAIT state.
o The end that sends the first FIN goes into the TIME_WAIT state,
because that is the end that sends the final ACK. If the other
end's FIN is lost, or if the final ACK is lost, having the end that
sends the first FIN maintain state about the connection guarantees
that it has enough information to retransmit the final ACK.
o Realize that TCP sequence numbers wrap around after 2**32 bytes
have been transferred. Assume a connection between A.1500 (host A,
port 1500) and B.2000. During the connection one segment is lost
and retransmitted. But the segment is not really lost, it is held
by some intermediate router and then re-injected into the network.
(This is called a "wandering duplicate".) But in the time between
the packet being lost & retransmitted, and then reappearing, the
connection is closed (without any problems) and then another
connection is established between the same host, same port (that
is, A.1500 and B.2000; this is called another "incarnation" of the
connection). But the sequence numbers chosen for the new
incarnation just happen to overlap with the sequence number of the
wandering duplicate that is about to reappear. (This is indeed
possible, given the way sequence numbers are chosen for TCP
connections.) Bingo, you are about to deliver the data from the
wandering duplicate (the previous incarnation of the connection) to
the new incarnation of the connection. To avoid this, you do not
allow the same incarnation of the connection to be reestablished
until the TIME_WAIT state terminates.
Even the TIME_WAIT state doesn't complete solve the second problem,
given what is called TIME_WAIT assassination. RFC 1337 has more
details.
o The reason that the duration of the TIME_WAIT state is 2*MSL is
that the maximum amount of time a packet can wander around a
network is assumed to be MSL seconds. The factor of 2 is for the
round-trip. The recommended value for MSL is 120 seconds, but
Berkeley-derived implementations normally use 30 seconds instead.
This means a TIME_WAIT delay between 1 and 4 minutes. Solaris 2.x
does indeed use the recommended MSL of 120 seconds.
A wandering duplicate is a packet that appeared to be lost and was
retransmitted. But it wasn't really lost ... some router had
problems, held on to the packet for a while (order of seconds, could
be a minute if the TTL is large enough) and then re-injects the packet
back into the network. But by the time it reappears, the application
that sent it originally has already retransmitted the data contained
in that packet.
Because of these potential problems with TIME_WAIT assassinations, one
should not avoid the TIME_WAIT state by setting the SO_LINGER option
to send an RST instead of the normal TCP connection termination
(FIN/ACK/FIN/ACK). The TIME_WAIT state is there for a reason; it's
your friend and it's there to help you :-)
I have a long discussion of just this topic in my just-released
"TCP/IP Illustrated, Volume 3". The TIME_WAIT state is indeed, one of
the most misunderstood features of TCP.
I'm currently rewriting "Unix Network Programming" (see ``1.5 Where
can I get source code for the book [book title]?''). and will include
lots more on this topic, as it is often confusing and misunderstood.
An additional note from Andrew:
Closing a socket: if SO_LINGER has not been called on a socket, then
close() is not supposed to discard data. This is true on SVR4.2 (and,
apparently, on all non-SVR4 systems) but apparently not on SVR4; the
use of either shutdown() or SO_LINGER seems to be required to
guarantee delivery of all data.
原文连接:
http://hi.baidu.com/w_ge/blog/item/105877c6a361df1b9c163d21.html
************************************************************************
文章三
当您尝试从 TCP 端口大于 5000 连接收到错误 ' WSAENOBUFS (10055) '
症状
如果您尝试建立 TCP 连接从端口是大于 5000, 本地计算机响应并以下 WSAENOBUFS (10055) 错误信息:
因为系统缺乏足够缓冲区空间或者因为队列已满无法执行套接字上操作。
解决方案
要点 此部分, 方法或任务包含步骤告诉您如何修改注册表。 但是, 如果修改注册表错误可能发生严重问题。 因此, 确保仔细执行这些步骤。 用于添加保护之前, 修改备份注册表。 然后, 在发生问题时还原注册表。 有关如何备份和还原注册表, 请单击下列文章编号以查看 Microsoft 知识库中相应:
默认最大数量的短暂 TCP 端口为 5000 ' 适用于 ' 部分中包含产品中。 这些产品中已添加新参数。 要增加最大值是短暂端口, 请按照下列步骤操作:
1.
启动注册表编辑器。
2.
注册表, 中找到以下子项, 然后单击 参数 :
HKEY _ LOCAL _ MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
3.
在 编辑 菜单, 单击 新建 , 然后添加以下注册表项:
MaxUserPort 值名称:
值类型: DWORD
值数据: 65534
有效范围: 5000 - 65534 (十进制)
默认: 0x1388 5000 (十进制)
说明: 此参数控制程序从系统请求任何可用用户端口时所用最大端口数。 通常, 1024 的值和含 5000 之间分配临时 (短期) 端口。
4.
退出注册表编辑器, 并重新启动计算机。
注意 一个附加 TCPTimedWaitDelay 注册表参数决定多久关闭端口等待可以重用关闭端口。
对应英文原文为:
SYMPTOMS
If you try to set up TCP connections from ports that are greater than 5000, the local computer responds with the following WSAENOBUFS (10055) error message:
An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
RESOLUTION
Important This section, method, or task contains steps that tell you how to modify the registry. However, serious problems might occur if you modify the registry incorrectly. Therefore, make sure that you follow these steps carefully. For added protection, back up the registry before you modify it. Then, you can restore the registry if a problem occurs. For more information about how to back up and restore the registry, click the following article number to view the article in the Microsoft Knowledge Base:
322756
(http://support.microsoft.com/kb/322756/) How to back up and restore the registry in Windows
The default maximum number of ephemeral TCP ports is 5000 in the products that are included in the 'Applies to' section. A new parameter has been added in these products. To increase the maximum number of ephemeral ports, follow these steps:
1.
Start Registry Editor.
2.
Locate the following subkey in the registry, and then click Parameters:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
3.
On the Edit menu, click New, and then add the following registry entry:
Value Name: MaxUserPort
Value Type: DWORD
Value data: 65534
Valid Range: 5000-65534 (decimal)
Default: 0x1388 (5000 decimal)
Description: This parameter controls the maximum port number that is used when a program requests any available user port from the system. Typically , ephemeral (short-lived) ports are allocated between the values of 1024 and 5000 inclusive.
4.
Exit Registry Editor, and then restart the computer.
Note An additional TCPTimedWaitDelay registry parameter determines how long a closed port waits until the closed port can be reused.
原文连接:
http://support.microsoft.com/kb/q196271/
上文来自ChinaUnix博客,如果查看原文请点:http://bbs.chinaunix.net/viewthread.php?tid=1186157
**********************************************************************************
附
java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at mypackage.WebServer.startServer(WebServer.java:13)
at mypackage.WebServer.main(WebServer.java:33)
这是我学JavaWeb遇到的第一个错误,解决花了一些时间。看到错误不要害怕,因为解决错误的同时,正是我们经验值增长也在增长的哦
这个是我在使用Socket和多线程实现一个JavaWeb服务器时遇到的
Address already in use 这句话是地址已经使用
这个是遇到这个问题的可能情况
I.就是当前端口已经有别的程序在占用着,所以要么把占用这个端口的程序关闭,要么重新换一个端口
II.端口号被占用,如果你有装oracle的话,有可能是oracle使用了8080端口,oracle安装后并且如果启动了OracleHttp服务会占用8080端口
III.我认为很可能是多启动了几次TOMCAT,在ECLIPSE下重复启动TOMCAT就会出现这个问题,你去调查一下看看是否是这个原因.
IV.如果不是windows操作系统,那么80端口已经被占用.如果是windows操作系统.请检查是否装有IIS.
查找问题原因:我的机子还没有装Oracle,并且使用的是Windows操作系统,装了IIS了,使用的是80端口,但我这个程序是用的8080端口,排除了II、IV。I说的笼统了点,我的问题是III多启动了几次TOMCAT,在ECLIPSE下重复启动TOMCAT就会出现这个问题
解决方法:
1.把myeclipse关掉后台的javax.exe进程杀掉。然后重新启动myeclipse就可以了
2. 把tomcat\conf文件夹里面的server.xml的端口换成其它未占用的80端口 如:8088、8089等等
建议出现上述情况使用第一种方法。
上文来自CSDN博客,如果查看原文请点:http://blog.csdn.net/zhulin902/archive/2008/12/17/3538540.aspx
发表评论
-
dom4j操作xml基础
2010-09-15 21:38 909DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准 ... -
手工搭建SSH集成工程
2010-09-15 21:23 861//搭建SSH集成工程://1.建立普通web工程,导入SSH ... -
tomcat+eclipse工程发布的两种方式
2010-09-15 20:52 2154tomcat+eclipse工程发布的 ... -
优秀的Java程序员必须了解GC的工作原理(转)
2010-05-05 20:14 1040一个优秀的Java程序 ... -
详细解析Java中抽象类和接口的区别(转)
2010-05-05 20:11 690在Java语言中, abs ... -
Vector、ArrayList和List的异同(转)
2010-05-05 20:07 1101线性表,链表,哈希表 ... -
JAVA面试题解惑系列(十一)——这些运算符你是否还记得?
2010-05-01 00:13 694好东西分享 有些运算符在JAVA语言中存在着,但是在实际开发 ... -
JAVA面试题解惑系列(十)——话说多线程
2010-05-01 00:11 752好东西分享 线程或者说多线程,是我们处理多任务的强大工具。线 ... -
JAVA面试题解惑系列(九)——继承、多态、重载和重写
2010-05-01 00:09 728好东西分享 什么是多 ... -
JAVA面试题解惑系列(八)——聊聊基本类型(内置类型)
2010-05-01 00:08 805好东西分享 基本类型,或者叫做内置类型,是JAVA中不同于类 ... -
JAVA面试题解惑系列(七)——日期和时间的处理
2010-05-01 00:06 810好东西分享 日期和时间的处理不仅在面试题中会考到,在实际项目 ... -
JAVA面试题解惑系列(六)——字符串(String)杂谈
2010-05-01 00:04 719好东西分享上一次我们已经一起回顾了面试题中常考的到底创建了几个 ... -
JAVA面试题解惑系列(五)——传了值还是传了引用?
2010-05-01 00:02 725好东西分享 JAVA中的传递都是值传递吗?有没有引用传递呢? ... -
JAVA面试题解惑系列(四)——final、finally和finalize的区别
2010-05-01 00:00 688好东西分享final、finally和finalize的区别是 ... -
JAVA面试题解惑系列(三)——变量(属性)的覆盖
2010-04-30 23:58 587好东西分享我们来看看这么一道题: Java代码 ... -
JAVA面试题解惑系列(二)——到底创建了几个String对象?
2010-04-30 23:56 759好东西分享 我们首先来看一段代码: Java代码 ... -
JAVA面试题解惑系列(一)——类的初始化顺序
2010-04-30 23:54 696好东西分享大家在去参加面试的时候,经常会遇到这样的考题:给你两 ... -
关于import org.apache.xpath.XPathAPI;
2009-06-23 12:31 4035import org.apache.xpath.XPathAP ... -
到底传值还是传引用
2009-06-10 10:32 1020不少同学总是质疑java编程中参数的传递,到底是传 ... -
自学Java 之 组合键
2009-06-09 10:10 1600今天练习了一个小的聊天程序,实现客户端与服务器端相 ...
相关推荐
然而,在启动 Tomcat 时,偶尔会遇到报错“Address already in use: JVM_Bind <null>:8080”,这意味着端口 8080 已经被占用。 为什么会出现这种情况?这通常是因为某个进程已经占用了端口 8080,阻止了 Tomcat 的...
【Java中的`java.net.BindException: Address already in use: JVM_Bind`异常】 在Java编程中,当你尝试启动一个服务器端应用,如Tomcat,或者任何需要监听特定端口的服务时,可能会遇到`java.net.BindException: ...
在编程和系统开发过程中,我们可能会遇到一个常见的错误——"Address already in use: JVM_Bind"。这个错误通常发生在尝试绑定一个已经被占用的网络端口时。本文将深入探讨这个问题,提供解决方案,并从源码角度解析...
在myeclipse中将html文件改成jsp文件时myeclipse卡住;将之前的任务关掉;再打开时多次部署项目的时候报错
"Address already in use: JVM_Bind(端口冲突)" 是一个常见的Java错误,它发生在尝试绑定一个已经被其他进程使用的网络端口时。在Java应用程序中,比如使用Jetty这样的服务器,当我们试图启动一个新的服务器实例时...
nested exception is: java.net.BindException: Address already in use: JVM_Bind 这里说的是1099端口被其它进程占用了. 二.解决办法 找出占用1099端口的进程,进入windows命令,查看什么进程占用了1099端口...
Reason: java.io.IOException: Transport Connector could not be registered in JMX: Failed to bind to server socket: tcp://0.0.0.0:61616 due to java.net.BindException: Address already in use: JVM_Bind”...
如果在配置完成后,尝试在MyEclipse或Eclipse中启动Tomcat时遇到“Address already in use: JVM_Bind”的错误,这通常意味着Tomcat的默认端口(8080)被其他应用占用。此时,应检查并关闭占用该端口的进程,如MySQL...
端口冲突java.net.BindException: Address already in use: JVM_Bind java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory deploy(部署)项目。点击 deploy 按钮,在弹出的Project Deployments...
nested exception is: java.net.BindException: Address already in use: JVM_Bind 这提示是 1099 端口被占用了。这是因为 Tomcat 服务器需要使用 1099 端口来启动,但是这个端口已经被其他应用程序占用了。 解决...
Tomcat的异常"***.BindException: Address already in use: JVM_Bind"说明端口8888已被占用,是常见的服务器启动错误之一。 6. JDBC编程 JDBC(Java Database Connectivity)是一个Java API,用于执行SQL语句。它...
4. **java.net.BindException: Address already in use: JVM_Bind**:这意味着8080端口已被其他服务占用。你可以通过修改Tomcat配置文件`server.xml`来改变Tomcat的默认端口,如示例所示,将端口改为80或其他未使用...
如果你收到类似这样的错误提示:“java.net.BindException: Address already in use: JVM_Bind <null>:8080”,这意味着8080端口已经被另一个进程占用。这种情况在多服务部署环境中比较常见,尤其是在同一台机器上...
java.net.BindException: Address already in use: JVM_Bind 当尝试通过`new ServerSocket(port)`创建一个服务器套接字,并指定端口号`port`(该值应在0到65536之间)时,如果出现此异常,表明所指定的端口已被...
- 查看日志文件`【协同主目录】\ApacheJetspeed\logs_sy`中的`ctp`文件,确认是否存在`严重:Error initializing endpoint java.net.BindException:Address already in use:JVM_Bind:80`的错误提示。 - 如果存在...
nested exception is: java.net.BindException: Address already in use: JVM_Bind 这种错误通常是由于端口号冲突或被占用导致的。 结论 Idea启动项目报端口号冲突或被占用的解决方法可以帮助开发人员快速解决...
1. **java.net.BindException: Address already in use: JVM_Bind** 这个异常表明尝试绑定的端口已被其他服务占用。解决方法是检查并更改端口号,选择一个未被使用的端口。使用`netstat -an`命令可以帮助识别哪些...
错误描述: 2009-7-12 15:40:35 org.apache.coyote.http11.Http11BaseProtocol start 严重: Error starting endpoint java.net.BindException: Address already in use: JVM_Bind:8080 at org.apache.tomcat.util...