锁定老帖子 主题:应用大概两周就内存爆掉.....
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-29
最后修改:2010-07-29
唉,每过一段时间就out of memory : heap space, 实在受不了了, 最近做了一下观察,发现old区会满,于是分两个日期做了一下记录: 20100723 [weblogic@webintam bin]$ ./jstat -gcold 11819 PC PU OC OU YGC FGC FGCT GCT 103424.0 103170.0 483968.0 339481.2 2768 13 5.958 29.150 [weblogic@webintam bin]$ ./jstat -gccapacity 11819 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC 40320.0 80640.0 40384.0 4032.0 4032.0 32320.0 483968.0 967936.0 483968.0 483968.0 49152.0 524288.0 103424.0 103424.0 2785 13 20100729 [weblogic@webintam bin]$ ./jstat -gcold 11819 PC PU OC OU YGC FGC FGCT GCT 107520.0 107490.4 967936.0 967936.0 7475 550 928.399 1004.342 [weblogic@webintam bin]$ ./jstat -gccapacity 11819 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC 40320.0 80640.0 80640.0 8064.0 8064.0 64512.0 483968.0 967936.0 967936.0 967936.0 49152.0 524288.0 107520.0 107520.0 发现old区内存快满了。于是通过jmap看了一下jvm里面对象的状态,下面贴出一些主要的占用内存的对象,完整的信息比较多,放在附件里面了:
Object Histogram: Size Count Class description ------------------------------------------------------- 725638808 289054 byte[] 35301320 601579 java.lang.Object[] 33931240 274517 * ConstMethodKlass 25736520 285517 char[] 23349000 270031 java.util.HashMap$Entry[] 19936080 166134 java.net.SocksSocketImpl 15378016 274517 * MethodKlass 14078272 23889 * ConstantPoolKlass 13016320 81352 weblogic.servlet.internal.ServletRequestImpl 11742584 255893 * SymbolKlass 11714688 81352 weblogic.servlet.internal.MuxableSocketHTTP 10654760 266369 java.util.HashMap 10254024 427251 java.util.ArrayList 9687320 23889 * InstanceKlassKlass 8824528 22338 * ConstantPoolCacheKlass 8017120 250535 java.lang.ref.Finalizer 7188744 299531 java.lang.String 6680928 278372 java.lang.ref.WeakReference 6508160 81352 weblogic.servlet.internal.ServletResponseImpl 5857344 81352 weblogic.servlet.internal.VirtualConnection 5206528 81352 weblogic.utils.http.HttpRequestParser 5059280 39098 int[] 4485720 186905 java.util.HashMap$Entry
看了一下,初步怀疑是socket有问题。因为是遗留系统,所以看了一下,果然发现socket通信的时候通过dataoutputstrem,datainputstream发送和读取数据。 在当前系统中,如果socket(未设置超时)有异常,那么就关闭socket(不是关闭inputstream,outputstream).如果成功就直接退出(不关闭socket或者sream). 这样做肯定有问 题。
于是google了一下发现了一些解释。 1. 在oracle的官方网站上有这么一句话: Relying on garbage collection to manage resources other than memory is almost always a bad idea. 像file,stream等都属于操作系统的资源,gc不能很好的管理甚至有时候管理不到。这时候就需要在使用这些资源的时候记得手动关闭(close). 2. 因为inutstream,outstream里面有对socket的strong reference,所以如果Inputstream,outputstream如果不释放,那么socket对象也会一直存活, 并进入old区. 我能想到的就这么多了,希望大家有什么好的建议继续补充。唉,头疼啊,回头改一下程序试试.
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-07-29
放到map,set等容器,最好用弱引用。
我能想到就这些了,等你调调再看。 呵呵 |
|
返回顶楼 | |
发表时间:2010-07-29
是否存在死循环?
|
|
返回顶楼 | |
发表时间:2010-07-29
没好办法,改代码,注意关闭资源。
|
|
返回顶楼 | |
发表时间:2010-07-29
用JProfiler或者JRockit跑一下看看
|
|
返回顶楼 | |
发表时间:2010-07-29
每天重启一次哈。
|
|
返回顶楼 | |
发表时间:2010-07-29
唉,jprofiler没法用啊...公司的机房管理很严格,哪台机器开哪个端口都要申请才行。
死循环应该不存在,否则CPU占用率应该会很高。 死锁也不存在,threaddump里面已经看过了。 但就是old区内存一个劲疯涨.... 大概一周就要重启一次。 先释放资源看看吧,因为堆里面好多socket的实现类对象。只是有个疑问,socket对象在什么情况下回收啊?大伙有谁知道啊。 比如:我这边没有关闭,对方已经关闭了而对我这里而言不知道这个socket已关闭的socket? |
|
返回顶楼 | |
发表时间:2010-07-29
将jvm的响应参数调大
|
|
返回顶楼 | |
发表时间:2010-07-29
仔细看看发送和接收的代码,很有可能是,都被byte[]占了
|
|
返回顶楼 | |
发表时间:2010-07-29
我们以前做socket通讯的时候也出现过类似的问题,最后发现时递归惹的祸,在socket中不能使用递归操作,你可以坚持一下你的代码
|
|
返回顶楼 | |