为了数据传递的方便,项目中使用了大量的session、hashmap等,结果现在jvm内存占用极高,主要表现为登录用户一多就死(三四十个用户,tomcat内存调到1G才勉强使用)。
在网上查了好久,感觉能导致内存大量占用的不良习惯项目中都有了:往session放大量数据,往hashmap放大量数据,随便new对象,等等。
小弟们皆新手,现已不知从何着手,如何挽回,希望前辈们能指点一二,不胜感激。

解决方案 »

  1.   

    尽量复用对象,对象使用完成后,设置成null
      

  2.   

    杯具...大量的session是干嘛用的啊?
      

  3.   

    问题也许不在session,权限能用多少内存啊,你还是看看数据库连接和IO流是否正确关闭了,是否产生了内存泄露.
    如果确实需要放很多东西进去,建议还是使用cache吧,比放session好的多
      

  4.   

    我猜问题不是出在MAP和SESSION里,应该是你的对象引用到处使用,结果垃圾回收起,认为你某些对象还是有用(实际没用了),结果内存居高不下
      

  5.   

    之所以没有被回收 是因为你那些保存在session中的容器持有着那些对象的引用
      

  6.   

    恩,还有可以使用request保存值,它的生命周期比session短
      

  7.   

    大量使用Session,本来就不符合Web开发规范和最佳实践仅仅判断权限,需要大量使用Session?? 感觉楼主的开发的思路还是需要调整
      

  8.   

    图片太多,好像打不开,这是链接:
    1.http://dl.javaeye.com/upload/picture/pic/73010/1174a21e-cb61-349b-b100-a2cb9ec7f26d.png2.http://dl.javaeye.com/upload/picture/pic/73020/87f44fbd-a137-310e-b34a-661c5e6904d2.png3.http://dl.javaeye.com/upload/picture/pic/73018/acce3f6d-373d-39bc-ba50-97fb1ef9de90.png4.http://dl.javaeye.com/upload/picture/pic/73016/0de2755f-7998-3b74-bd17-b5f2acd58dbc.png5.http://dl.javaeye.com/upload/picture/pic/73014/26ce86bf-453c-365a-9d24-0f5f9641bd00.png6.http://dl.javaeye.com/upload/picture/pic/73012/5b5d5999-a0dd-3cc9-9bf7-425e26f0d1dc.png7.http://dl.javaeye.com/upload/picture/pic/73030/f1f17bf4-a865-3095-b778-0ddc49918aed.png8.http://dl.javaeye.com/upload/picture/pic/73028/5e2b450a-35f8-35e8-ba93-a9b75ae56d5a.png9.http://dl.javaeye.com/upload/picture/pic/73026/439fde7f-aacb-39ba-993b-897da94dd058.png10.http://dl.javaeye.com/upload/picture/pic/73024/ec615e75-6c30-3e6c-96cf-a69bf2e344e7.png11.http://dl.javaeye.com/upload/picture/pic/73022/b97458c1-617b-3c8a-abae-9244d69603e4.png
      

  9.   


    好像要自己把url复制到地址栏才能看到
      

  10.   

    把图片传到你的CSDN空间相册,就能在这里展示了~
      

  11.   

    原来是javaeye过来的,
    如果是大量使用session的话,session可以用request代替。我感觉是你没关闭数据连接,仅仅是感觉。
      

  12.   


    正解!除了必要的数据,其它全部移到request。
      

  13.   


    嗯,这下应该可以了。1.http://hi.csdn.net/attachment/201009/26/1185080_1285493770VG8b.png2.http://hi.csdn.net/attachment/201009/26/1185080_1285493773B6eP.png3.http://hi.csdn.net/attachment/201009/26/1185080_128549377493B3.png4.http://hi.csdn.net/attachment/201009/26/1185080_1285493777011t.png5.http://hi.csdn.net/attachment/201009/26/1185080_1285493780zSL0.png6.http://hi.csdn.net/attachment/201009/26/1185080_1285493784JM7J.png7.http://hi.csdn.net/attachment/201009/26/1185080_1285493788HZOK.png8.http://hi.csdn.net/attachment/201009/26/1185080_1285493790qn2n.png9.http://hi.csdn.net/attachment/201009/26/1185080_1285493793Uhrs.png10.http://hi.csdn.net/attachment/201009/26/1185080_1285493799YIAg.png11.http://hi.csdn.net/attachment/201009/26/1185080_1285493803Kpaa.png
      

  14.   

    不至于吧 30-40用户就卡的不行了,你往session里存了多少东西...可以把session设置时间短点
      

  15.   


    我现在的做法是先把session里用过的对象remove掉。
      

  16.   

    HttpSession不能丢太多数据。否则服务器肯定过载。
    修改你的系统设计吧。
      

  17.   

    把能用request对象保存的session换成request
      

  18.   

    session可以暂时存在硬盘中...需要在活化参考<Context>
    <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
    <Store className="org.apache.catalina.session.FileStore" directory=""/>
    </Manager>
    </Context>
      

  19.   

    org.apache.Catalina.JDBCStore是存在数据库中.. 参考Servlet Session的持久化
    当一个 Session 开始时, Servlet 容器会为 Session 创建一个 HttpSession 对象。 Servlet 容器在某些情况下把这些HttpSession 对象从内存中转移到文件系统或数据库中,在需要访问 HttpSession 信息时再把它们加载到内存中。
     
    Session 的持久化是由 Session Manager 来管理的。 Tomcat 提供了两个实现类
    org.apache.catalina.session.StandardManager
    org.apache.catalina.session.PersistentManager