IBM jdk 1.42 
  
  运行环境是 websphere   我分析了下gc回收文件,发现内存是不断上升的,一般是2-3天就到了最大值2G,然后就内存溢出了。  但是通过gc回收文件看不出具体是哪个对象占用内存。我也分析了heapdump,同样也看不出来。有没有可以动态监控内存的使用情况的工具?或者大家有其他更好的方法。  另外程序有一个静态数据集 static Vector vc ,程序经常会大批量的向里面添加对象,使用完后也会remove掉。我认为这样应该会被回收掉吧,请大家帮忙看看。

解决方案 »

  1.   

    我常用的方法是用JMAP, 用jmap -histo <pid> 把对象数量打印出来。
    我写了一个脚本,每隔一段时间就打印信息,然后按照时间改名,收集到一定数量的数据后,我还有一个小程序,按照类名比较,分析数据趋势,变化不大的就删掉,变化乱的就存到一个excle文件里,然后用excle的图表功能,对可疑的类画时间-数量图,找出最有泄露嫌疑的,然后看代码。
      

  2.   


     jmap 是jdk 1.42里自带的?
      

  3.   

    sun jdk 有jvisualvm.exe 和 jconsole.jar
      

  4.   

    都有dump了,没理由找不出问题的,找到占用量最大的对象,查看下都是被什么东西引用的
    重点关注各类static的Vector,ArrayList,Map
      

  5.   

    谢谢,大家的帮助!我分析了下heap dump ,占用大量内存的是几个类    org/apache/xerces/dom/Texlmpl
        org/apache/xerces/dom/ElementImpl
        org/apache/xerces/dom/ElementNSImpl
        org/apache/xerces/dom/AtrributeMap另外我程序是通过webservice用的是axis,接收到消息,然后把消息存入到一个statice ArrayList里,待我从队列中取出消息处理后,我会remove掉ArrayList里的消息。我现在担心的是在静态集合里的对象是不是gc会回收得比较慢,所以导致内存溢出了
     
                                               
      

  6.   


    dom?你里面解析了dom文件没有?是怎么做处理的?
      

  7.   

    程序中 没有去解析dom,只是用到了axis,不是webservice会自己去调用到xerces
      

  8.   

    还有一种情况希望对楼主有用··就是import的时候不能只引用到包·然后就一个通配符··我的曾经测试过·程序到后面比那些具体引用类的程序占用的内存要大很多··
      

  9.   

    都还没用过,jmap的好使,然后就使用mat工具分析dump文件
      

  10.   

    确实是有大量对象是被static ArrayList引用。不过程序是会remove里面的对象的,是不是因为ArrayList是static的,所以尽管remove了,但是还是清除不掉引用,内存空间还是没有释放。
      

  11.   

    这个和static没什么关系吧,static只是说明ArrayList是静态的无法释放,但里面的元素是new出来的,remove了里面的元素就释放了。建议你检查下remove的逻辑是否有问题。
      

  12.   


    我也遇到过内存泄露的问题,查了好久发现时webService引起的
    我用的是axis2 1.4.1,这个版本bug
    客户端的stub改成单例就行了
      

  13.   


    我调用的就是ArryaList类的remove方法。