最近发现JDK6的版本中有一个比较大的bug,发现问题及解决问题如下:
首先使用jmap将进程的堆栈信息获取到,然后使用MAT进行分析,此过程可参考我以前转载的博客。
发现如下:
从上面两个图中可以很清晰的看到sun.net.httpserver.ServerImpl占用了大部分的堆栈空间,内存溢出肯定是这个对象过多的原因。
如何解决呢?由于这个问题出现的次数和频率无法确认,总是在本地测试是可以的,在生产上过一段时间就会出现问题,百度之发现毫无类似的现象,从自己的代码分析,发现代码是那么的严谨,没有太复杂的逻辑。
google之,最近google一直被封,找了一个VPN去搜索了一下,发现果然是JDK自带的bug。
主要是HttpConnection的close()的问题,没有过多时间去修改jdk6的源码,下载jdk7的版本进行测试,此问题消失。
链接:http://bugs.java.com/view_bug.do;jsessionid=dfe841c3152d878571573bafceb8?bug_id=6946825
JDK6内存泄漏问题
本文介绍了在JDK6中遇到的一个导致内存溢出的问题,通过使用jmap和MAT工具定位到sun.net.httpserver.ServerImpl对象占用大量堆空间。经过调查发现这是由HttpConnection.close()方法的一个已知bug引起,并验证了升级到JDK7可以解决该问题。
1272

被折叠的 条评论
为什么被折叠?



