java异常及解决方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java异常及解决方法
1:.BindException: Address already in use解决方法
在网络编程中,特别是在短时间内new的网络连接太多,经常出现.BindException: Address already in use: JVM_Bind的异常,网络有很多介绍此异常的,通常都是在说是要使用的端口被别的程序已经使用,但有时并不是这个原因,通过仔细查找,找到一些很好的资料,在此将其一一记录下来。短时间内new socket操作过多而socket.close()操作并不能立即释放绑定的端口而是把端口设置为TIME_WAIT状态过段时间(默认240s)才释放(用netstat -na可以看到)最后系统资源耗尽
(windows上是耗尽了pool of ephemeral ports 这段区间在1024-5000之间) Socket 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
2:.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 =
0net.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,
3:当您尝试从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 注册表参数决定多久关闭端口等待可以重用关闭端口。
4:ng.OutOfMemoryError: Java heap space
Heap size 设置
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
解决方法:
手动设置Heap size
修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m
或修改catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"