锁定老帖子 主题:应用大概两周就内存爆掉.....
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-30
根据内存的变化,感觉,socket 的回收不是发生在关闭之后,而是JVM每隔一段时间就回收一次关闭之后的socket.
|
|
返回顶楼 | |
发表时间:2010-07-30
如果是jdk6,你可以用jdk6自带的jvisualvm工具profile一下。
对于刚才说的没法远程使用的问题,你可以在服务器上先启动vncserver,然后用vnc链接来启动jvisualvm或者你们使用的jprofile。 |
|
返回顶楼 | |
发表时间:2010-07-30
m7788 写道
仔细看看发送和接收的代码,很有可能是,都被byte[]占了
没有任何自定义的类变量或者对象变量是byte[] 类型或者 char[] 类型,现在感觉这些泄漏的应该是从inputstream,outputstream里面的.... |
|
返回顶楼 | |
发表时间:2010-07-30
像你碰到的这种Java Heap泄露其实是非常容易检查出原因的。jdk6的话,先用jmap dump出heap文件,然后使用Eclipse Memory Analyzer分析,Eclipse Memory Analyzer的内存泄露分析出来的结果基本上已经八九不离十了。如果是jdk6以下的话,只能用jmap -histo {pid},看对象统计信息,这个会比较麻烦一点,但从输出结果+自己分析,基本上还是能定位到原因的。
|
|
返回顶楼 | |
发表时间:2010-07-30
kongxx 写道
如果是jdk6,你可以用jdk6自带的jvisualvm工具profile一下。
对于刚才说的没法远程使用的问题,你可以在服务器上先启动vncserver,然后用vnc链接来启动jvisualvm或者你们使用的jprofile。 谢谢..可是我们是jdk5...
|
|
返回顶楼 | |
发表时间:2010-07-30
tmj_159 写道
根据内存的变化,感觉,socket 的回收不是发生在关闭之后,而是JVM每隔一段时间就回收一次关闭之后的socket.
没看懂..... 是不是没有关闭的socket不回收? 如果关闭的socket就可以回收的话是不是就和平常的对象一样对于gc是没有什么特别之处的? |
|
返回顶楼 | |
发表时间:2010-07-30
michael.softtech 写道 唉,jprofiler没法用啊...公司的机房管理很严格,哪台机器开哪个端口都要申请才行。
死循环应该不存在,否则CPU占用率应该会很高。 死锁也不存在,threaddump里面已经看过了。 但就是old区内存一个劲疯涨.... 大概一周就要重启一次。 先释放资源看看吧,因为堆里面好多socket的实现类对象。只是有个疑问,socket对象在什么情况下回收啊?大伙有谁知道啊。 比如:我这边没有关闭,对方已经关闭了而对我这里而言不知道这个socket已关闭的socket? 这是问题的两个层面: 1、如果socket关闭或超时,操作系统是知道的,他会回收系统资源,如果不能回收,操作系统的描述符很快就会用完,这时就不能再创建socket,客户端也就不能再连接了。 2、现在是操作系统已经回收了资源,但jvm回收的标准是这个对象是否还存在引用,如果你的程序用完socket不释放引用,jvm会认为此对象还需使用,就一直不会释放。 分析你的情况应该和socket用完不关关系不大,但也是问题,可能是你的程序有BUG,引用了socket,在不用时没有解除引用,造成内存泄漏。重点看下list这些数据结构。 |
|
返回顶楼 | |
发表时间:2010-07-30
是不是你把socket放到map里了,而没有及时清理?
|
|
返回顶楼 | |
发表时间:2010-07-30
michael.softtech 写道
kongxx 写道
如果是jdk6,你可以用jdk6自带的jvisualvm工具profile一下。
对于刚才说的没法远程使用的问题,你可以在服务器上先启动vncserver,然后用vnc链接来启动jvisualvm或者你们使用的jprofile。 谢谢..可是我们是jdk5...
呵呵,你怎么只看了我上一句,没看我下一句 |
|
返回顶楼 | |
发表时间:2010-07-30
呵呵,连到底是不是socket的原因都不确定,就在讨论怎么修改的问题
|
|
返回顶楼 | |