现网出现一个问题,Client访问我们的接入服务器A,A将请求转给服务器B(Http请求,使用HttpURLConnection实现);某天,B服务器突然宕机,Client在登录的过程中,经常需要访问B,B宕机一段时间后,A也报出OutOfMemoryError。
这个问题定位了很久,开始以为我们的代码有问题,以为IO流没有关闭,打开GC日志进行压力测试,没有发现堆内存问题。
但JVM还是宕机。
之后,在Linux下,我们模拟现网的情况,访问另一机器的不存在的端口,在大并发的情况下,Xmx设为1024m,大概12个小时,JVM会OutOfMemory;如果将Xmx设为1700m,不到一小时,JVM就会OutOfMemory;
HttpURLConnection是基于TCP实现的,所以为了进一步验证,我把HttpURLConnection改成了Socket,同样访问另一机器的不存在的端口,也会出现同样的问题;
在Windows下,我也经过两样的验证,跑了10多个小时,没有出现异常,因此,可以断定,Linux下的JVM 1.5实现有Bug。Socket实现是依赖本地的实现的,Linux下的Socket实现有Bug,导致JNI内存溢出。
-----------------------------
希望遇到同样问题的朋友,可以少走弯路。
这个问题定位了很久,开始以为我们的代码有问题,以为IO流没有关闭,打开GC日志进行压力测试,没有发现堆内存问题。
但JVM还是宕机。
之后,在Linux下,我们模拟现网的情况,访问另一机器的不存在的端口,在大并发的情况下,Xmx设为1024m,大概12个小时,JVM会OutOfMemory;如果将Xmx设为1700m,不到一小时,JVM就会OutOfMemory;
HttpURLConnection是基于TCP实现的,所以为了进一步验证,我把HttpURLConnection改成了Socket,同样访问另一机器的不存在的端口,也会出现同样的问题;
在Windows下,我也经过两样的验证,跑了10多个小时,没有出现异常,因此,可以断定,Linux下的JVM 1.5实现有Bug。Socket实现是依赖本地的实现的,Linux下的Socket实现有Bug,导致JNI内存溢出。
-----------------------------
希望遇到同样问题的朋友,可以少走弯路。