解决办法: 在调用httpclient时加入一行:
httpmethod.setRequestHeader("Connection", "close");
让这个socket在请求完毕后就关闭.
http://tw.myblog.yahoo.com/robin ... =1430&next=1363
***************************************************************************
CLOSE_WAIT状态的生成原因
如果是CLIENT端主动断掉当前连接的话,那麼双方关闭这个TCP连接共需要四个packet:
Client ---> FIN ---> Server
Client <--- ACK <--- Server
这时候Client端处於FIN_WAIT_2状态;而Server 程序处於CLOSE_WAIT状态。
Client <--- FIN <--- Server
这时Server 发送FIN给Client,Server 就成为LAST_ACK状态。
Client ---> ACK ---> Server
Client回应了ACK,那麼Server 才会成为CLOSED状态。
******************************************************************************
解决方法:
1.(暂时生效,重新启动 linux 後,会还原成预设值)
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_keepalive_time=1800
sysctl -w net.ipv4.tcp_keepalive_probes=2
sysctl -w net.ipv4.tcp_keepalive_intvl=2
2.(永久生效)
vi /etc/sysctl.conf
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# 探测次数
net.ipv4.tcp_keepalive_probes=2
# 探测间隔秒数
net.ipv4.tcp_keepalive_intvl=2
编辑完 /etc/sysctl.conf,要重启network 才会生效
[root@temp /]# /etc/rc.d/init.d/network restart
**********************************************************************************
PS: 发生CLOSE_WAIT 的原因,可能在於程式内 一端的Socket使用close後,另一端的Socket没有使用close.检查一下代码内是否有 Server端在某些异常情况时,没有关闭Socket,将之修改,应可改正此一问题
连接进程是通过一系列状态表示的,这些状态有:LISTEN,SYN-SENT,SYN-RECEIVED,ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT和 CLOSED。CLOSED表示没有连接,各个状态的意义如下: LISTEN - 侦听来自远方TCP端口的连接请求; SYN-SENT - 在发送连接请求后等待匹配的连接请求; SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认; ESTABLISHED - 代表一个打开的连接,数据可以传送给用户; FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认; FIN-WAIT-2 - 从远程TCP等待连接中断请求; CLOSE-WAIT - 等待从本地用户发来的连接中断请求; CLOSING - 等待远程TCP对连接中断的确认; LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认; TIME-WAIT - 等待足够的时间以确保远程TCP接收到连接中断请求的确认; CLOSED - 没有任何连接状态; TCP连接过程是状态的转换,促使发生状态转换的是用户调用:OPEN,SEND,RECEIVE,CLOSE,ABORT和STATUS;传送过来的数据段,特别那些包括以下标记的数据段SYN,ACK,RST和FIN;还有超时,上面所说的都会时TCP状态发生变化。
tomcat启动时会加载在myeclipse中已经关闭的项目的信息,是因为虽然项目已经被关闭,但是仍旧加载在tomcat中,解决的方法是:
找到当时安装tomcat的文件夹,打开,里面有一个workspace--->将其中除过ROOT,和要运行的项目,其他的都删除即可,在此处删除并非将项目删除,只是删除了他们的加载,下次要运行他们是重新加载即可。
另外要注意的就是。每次运行完这个项目后,在加载中将tomcat remove掉,就不会有这样的问题了。
若找不到当时的安装包,就打开所有的项目,将之前添加到tomcat中的项目remove掉,这样即使不关闭项目,也不会被加载进来。
1)TIME_WAIT: 状态的连接达到了 709
sql server占用的TIME_WAIT最多,还有nginx, tomcat都有一些处于 TIME_WAIT状态。
2)并且最大的端口达到了 65327 ,六万多,几乎接近端口的最大值 65535.
因为是 Windows server 2008,不同Linux下的TCP的调优。
解决方法:将 TcpTimedWaitDelay 调到 30S,让 TIME_WAIT 状态的维持最多30S,默认是4分钟。
如何查看或设置TcpTimedWaitDelay:
cmd中运行 regedit 命令,找到 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注册表子键
看看有没有 TcpTimedWaitDelay 项,有的话直接修改,没有的话创建一个并创建名为 TcpTimedWaitDelay 的新 REG_DWORD 值。 将此值设置为十进制 30,其为十六进制 0x0000001e。该值将等待时间设置为 30 秒。 停止并重新启动系统。 缺省值:0xF0,它将等待时间设置为 240 秒(4 分钟)。 建议值:最小值为 0x1E,它将等待时间设置为 30 秒。
修改之后,重启系统,在观察,TIME_WAIT在100左右徘徊。效果还是立竿见影的。几天来一直再也没有出现Tomcat假死的情况。
你在停止TOMCAT的时候,会调用Catalina类的stopServer方法,在该方法中会取得已经存在的网络连接的Socket对象,将调用Socket的close方法关闭已经当前的网络连接。
所以,当停止tomcat时,如果有新的请求的话,会被拒绝
回答不容易,希望能帮到您,满意请帮忙一下,谢谢 !
time wait的连接只能让同一客户端重用 应该在tomcat或apache里配置不使用长连接,就不会有time_wait了,而且time_wait并不会堵塞网络,一般都有默认值的,数量达到一定值就会自动关闭多出来的
虽然Java有自动内存回收机制,但是如果是数据库连接、网络连接、文件操作等,不close是不会被回收的,属于不正确的代码。
也就是说,有close方法,必须得自己调用一下才行。
垃圾回收机制仅在Java虚拟机所控制的范围内释放资源。
对于类似于数据库连接、socket以及文件操作等,
如果有close方法,在你完成任务后执行它
并且最好在finally块内做close,因为即使发生了例外,这些代码也能被调用。
对于使用完了的对象来讲,Java不推荐使用类似于C++的析构函数来释放内存(C++中new完后得delete,Java中new完,使用后,将其置
成null比较好),因为GC会调节最适当的时间来释放内存,在程序中滥用delete会降低Java程序的性能(但应该不会引发额外的错误)。
在Java中对资源的读写最后要进行close操作,以下是2种释放资源处理方式:
第1种:把close()放在try中。
try {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(
"out.txt", true)));
pw.println("This is a test.");
pw.close();
} catch (IOException e) {
e.printStackTrace();
第3种:使用try-with-resource语句。
try (PrintWriter pw = new PrintWriter(
new BufferedWriter(
new FileWriter("out.txt", true)))) {
pw.println("This is a test.");
} catch (IOException e) {
e.printStackTrace();
无论是否有异常发生close()方法都应该被调用,因此close()应放在finally中。而从Java 7开始,可以使用try-with-resource语句。
这个情况和WEB的session和关,是连接池就会重用。
应该是什么东西获取了某个锁长时间不释放,而很多其他的线程又在等待这个锁。
说明:
1)线程状态是 Blocked,阻塞状态。说明线程等待资源超时!
2)“ waiting to lock <0x000000074ada45b8>”指,线程在等待给这个 0x000000074ada45b8 地址上锁(英文可描述为:trying to obtain 0x000000074ada45b8 lock)。
3)在 dump 日志里查找字符串 0x000000074ada45b8,发现有大量线程都在等待给这个地址上锁。如果能在日志里找到谁获得了这个锁(如locked < 0x000000074ada45b8 >),就可以顺藤摸瓜了。
4)“waiting for monitor entry”说明此线程通过 synchronized(obj) {……} 申请进入了临界区,从而进入了下图1中的“Entry Set”队列,但该 obj 对应的 monitor 被其他线程拥有,所以本线程在 Entry Set 队列中等待。
5)第一行里,"http-nio-8080-exec-7" daemon"是 Thread Name 。tid指Java Thread id。nid指native线程的id。prio是线程优先级。[0x00007f9c557d4000]是线程栈起始地址。