本帖最后由 wapigzhu 于 2012-10-15 08:23:37 编辑

解决方案 »

  1.   

    遇见过一次,就是服务长时间运行内存一直上升,登陆的人越多越慢。
    我们的是数据库连接的问题,不释放资源。
    数据库连接池从dbcp换成c3p0解决问题。不知道对你的有帮助没
      

  2.   

    谢谢你的回复~
    因为我们数据量不是很大,一个小时2,30w条大概
    对并发的顺序执行要求又很严,
    就是说程序里sql语句调用顺序是a,b的话,执行顺序也要是a,b
    只用了一个数据库的连接,这个连接一直不释放
    然后把所有执行sql的地方全部放在一个队列里,
    用这个连接一次执行这个队列
    应该不会是数据库的资源的问题吧
      

  3.   

    谢谢你的建议~
    现在有点麻烦的是服务器部署是在客户那边,
    他们又不允许我们远程登录,
    很多事情都只有告诉他们的运维人员每个步骤
    然后他们来操作,下一个dump都要花半天时间
    我们拿到之前几次的dump,确实查出有5,6个内存泄漏的地方
    但是数据量并不大,最大一个也就占用300M的样子,
    完全解释不了为什么那么那边内存会疯狂的上涨
    而且修改了以后还是这个样子,最新的dump还没拿到最奇怪的问题是用top看见java进程占用的内存是8g,
    表现出来也是对客户端的响应很慢
    但是把当时的dump拿来看只有3g,
    实际有效引用的地方只有1.3g,也就是所有的shallow size之和
    如果加上未被引用的对象,shallow size在2.3g另外的5g内存不知道是被什么占用了把内存先设小店,然后开启GC日志
    这个建议不错,先这么试试
      

  4.   

    我觉得是top和dump本来就没有测一样的内容,对dump不了解,但top是linux的内置命令,按理应该更准确一点吧
    可不可以找一个linux上更权威强力的工具来测呢,也可以印证一下top结果找到一个:http://valgrind.org/
      

  5.   


    其实两者都是准的,但是统计口径不同。
    要注意到JVM所有申请的内存,首先不是全都让程序给消耗光了,其次更不见得就已经全部实际被分配完毕;各位应该记得Runtime对象有几个函数,比如:freeMemory()、totalMemory()。
    top统计的是整个Java所有申请的内存,从操作系统角度来说,这是合理的。dump只是把Java中程序已经使用的部分导出来,从JVM的角度来说,这也是合理的。