有一个项目要求,进行性能测试,每两秒钟服务器端和客户端互发15000字节随机数据,服务器端接收到数据后,进行数据统计,然后将接收的数据数组设为null,抛弃,调用System.gc前,接收到1330万左右的数据出现内存溢出,调用System.gc后接收到2600万左右的数据出现内存溢出,这个究竟是怎么回事,我并没有进行数据的保存,而且发送的数据是固定的随机数组,数据初始化后没有再new过,内存溢出应该是接收的问题,可是JVM参数设置如下:-Xms512m -Xmx512m -Xss4m -Xincgc -Xloggc:gc.log应该说比较大了,为什么会出现这个问题?求达人解答

解决方案 »

  1.   

    你用jconsole 连进去然后看那个对象比较多。。
      

  2.   

    用户程序没有new,不表示系统的代码没有new
      

  3.   

    你运行 System.gc 一点用处都没有用,你的 2600 万数据肯定都是放在内存中的吧,如果是这样的话 GC 根本就不会回收垃圾对象,因为这些数据还都是被引用到的。接收到的数据应该处理掉,而不是只接收不扔掉。
      

  4.   

    我把接收的数据对象设为null了
      

  5.   

    而且中间对数据是不是还做什么处理了
    比如说大量的字符串+运算 但是没有用到stringbuffer 或者是运算中大量生成了新对象
      

  6.   

    其他运算都没有
    objectArr=((Object[])o);
    System.out.println("receive data length:"+objectArr.length);
    receiveBytes+=objectArr.length;
    o=null;
    objectArr=null;
    System.gc();
    System.out.println("by "+getNowTime()+" receive "+receiveBytes+" bytes");
    这是接收部分的全部代码
      

  7.   

    我觉得你可以在外面丢个stringbuffer 每次进来的时候先delete 再append
    原来做过一个项目 一开始也是没注意 就是拼一个url地址 结果也是内存溢出 找了好久才发现 我那个数据量也不大 
    我觉得你如果有字符串运算的话 可以先把这些屏蔽掉 然后再测 如果没问题 证明就是字符串惹的祸
      

  8.   

    看看这个是我以前遇到的问题
    http://blog.csdn.net/Arthur0088/archive/2010/01/06/5143813.aspx
      

  9.   

    换个JRE试试。我做过的项目,经常是用sun的jre不好使,用weblogic自己的jrocket就好了。
      

  10.   

    现在全都是oracle的JRE了>.<顺便提醒下LZ,System.gc()调用不代表系统会立刻执行gc,只是建议JVM可以执行GC了,至于具体执行GC的时机,还是由JVM自己决定的。另外,调整perm区貌似没意义吧?只有项目中的class太多才会导致perm区爆掉
      

  11.   

    jconsole 连进去然后看那个对象比较多。。