论坛首页 Java企业应用论坛

应用大概两周就内存爆掉.....

浏览 13411 次
精华帖 (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区.

   我能想到的就这么多了,希望大家有什么好的建议继续补充。唉,头疼啊,回头改一下程序试试.

 

 

 

   发表时间:2010-07-29  
放到map,set等容器,最好用弱引用。
我能想到就这些了,等你调调再看。
呵呵
0 请登录后投票
   发表时间:2010-07-29  
是否存在死循环?
0 请登录后投票
   发表时间:2010-07-29  
没好办法,改代码,注意关闭资源。
0 请登录后投票
   发表时间:2010-07-29  
用JProfiler或者JRockit跑一下看看
0 请登录后投票
   发表时间:2010-07-29  
每天重启一次哈。
0 请登录后投票
   发表时间:2010-07-29  
唉,jprofiler没法用啊...公司的机房管理很严格,哪台机器开哪个端口都要申请才行。
死循环应该不存在,否则CPU占用率应该会很高。
死锁也不存在,threaddump里面已经看过了。
但就是old区内存一个劲疯涨....
大概一周就要重启一次。
先释放资源看看吧,因为堆里面好多socket的实现类对象。只是有个疑问,socket对象在什么情况下回收啊?大伙有谁知道啊。
比如:我这边没有关闭,对方已经关闭了而对我这里而言不知道这个socket已关闭的socket?
0 请登录后投票
   发表时间:2010-07-29  
将jvm的响应参数调大
0 请登录后投票
   发表时间:2010-07-29  
仔细看看发送和接收的代码,很有可能是,都被byte[]占了
0 请登录后投票
   发表时间:2010-07-29  
我们以前做socket通讯的时候也出现过类似的问题,最后发现时递归惹的祸,在socket中不能使用递归操作,你可以坚持一下你的代码
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics