Java中Session的垃圾回收机制

EF0718 发布于 2013/12/02 12:16
阅读 1K+
收藏 1

对自己的网站测试跑了30min,共60W个请求,用性能监控工具发现其jvm内存一直在向上飚,感觉有内存泄露的迹象,最后发现是session对象占满了堆。每次请求都模拟用户登录退出,退出时在代码中this.getSession().invalidate()了。是不是session现在是存在session池里面的?为什么模拟请求跑完了,手动gc,jvm内存几乎没怎么下降。是session依然被session池引用,还是session被放到年老代里面去了要等到full gc才能被回收?请教大神们,短连接为主的web应用,如何设置jvm参数(垃圾回收方面的)?

机子的配置:1G jvm内存,双核。

加载中
1
EF0718
EF0718
找到原因了,是session失效时间设置过长导致的。
0
Altman
Altman
这个得取决于你的web服务器吧?Session是由web服务器管的吧
0
Monkey
Monkey
你用了多少内存,你分配了多少内存,如果分配1G,实际用了500M,对java来说可能根本不叫垃圾。分配越多,java垃圾内存就越多,gc就越倾向于懒惰。
EF0718
EF0718
用了900M内存了
0
antipro
antipro
手动GC只是“建议JVM进行垃圾回收”,实际是否回收由JVM自行决定。
0
antipro
antipro
我看API的解释是invalidate()这个方法是让session失效并移除上面绑定的所有对象,这里的失效应该不是直接把session对象销毁吧,可能容器仍然有引用指向该session对象,所以JVM在进行垃圾回收时不会删除它。
返回顶部
顶部