java内存泄漏问题排查(三)

这个系列应该改个名字,叫做java 命令行窗口(运行在windows环境下)突然退出,但是端口号存在,java虚拟机进程也存在。 昨天出差到客户现场一番排查。排除了之前的一系列推测(根据程序日志发现,程序异常退出是有...

这个系列应该改个名字,叫做java 命令行窗口(运行在windows环境下)突然退出,但是端口号存在,java虚拟机进程也存在。

 

昨天出差到客户现场一番排查。排除了之前的一系列推测(根据程序日志发现,程序异常退出是有规律的,每3小时一次,在57分异常退出)

  1. 内存溢出:程序退出后未生成dump文件,且用jconsole显示内存一直正常。
  2. 客户计算机是否有异常:查看系统日志、cpu,内存(发生问题时间点的)都一切正常。
  3. 网络请求http连接未释放,连接池占满假死:程序已经优化,排除httpclient使用问题导致连接异常,且在cmd下查看netstat显示正常。
  4. 数据库连接未回收,卡死:优化数据库连接配置参数,并查看发生故障时的连接,显示正常。

 

就在我一筹莫展,几近放弃的时候客户UPS有问题,意外让服务器重启使我找到了问题的所在。

程序重启后,有些开机自动运行程序,这时候我手贱在cmd下用命令netstat -ano|findstr 8083(我的程序端口),竟然以为的发现,是启动着的。。。。。。。。。。。而我的程序是没有配置开机自动运行的,这个时候我才想起来会不会是有其他程序跟我是一样的端口。(我之前也不是没有想到过端口占用的问题,但是我的命令行程序在端口被占用状况下,运行后没几秒就会自动退出,然后在错误日志种提示 Address is already benn used,然而这个搞笑的是,我的程序如果先启动,另外一个也是用8083端口的程序后启动,他是个exe程序,不会自动退出,但是另外会启动一个守护进程,每3个小时查看一次,然后把我的程序给干掉了,把他的程序给启动起来)因此每次我查看netstat的时候,发现8083端口还在,给我问题排查产生了误解。现在想想问题原因很坑爹,但是排查过程当中也不是没有收获,在这些弯路之中,更深入的了解了jvm、httpclient连接池、数据库连接池相关的知识。

至此,问题得到解决

本文标题为:java内存泄漏问题排查(三)

基础教程推荐