精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-15
nickxu 写道 xucons 写道 很有可能是THREAD LOCAL引起的,要注意threadlocal的使用要清空。
我想问一下ThreadLocal的内容不是线程结束后自动被jvm回收吗?需要手动清空? 我查了一下,好像不需要的 |
|
返回顶楼 | |
发表时间:2008-12-16
经分析,session确实可能引起问题。我们程序完全没有用session,也没用关闭session。
一个nginx随机分发到两个tomcat上面, 假设一个极端的情况下,一个用户一个小时,点击了200万个不同的页面,每次通过nginx分发到不同tomcat上, T1(tomcat1),T2(tomcat2),收到url的顺序是t1,t2,t1,t2,t1,t2 .......... 1. t1判断是New url,生成一个session,同时置sessionid与客户端的会话cookie中 2. t2判断是New url,同时判断客户端会话cookie的中的sessionid,不是t2自己生成的id,于是生成一个新session,同时置sessionid与客户端的会话cookie中 3. t1收到url,同时判断客户端会话cookie的中的sessionid,不是t1自己生成的id,于是生成一个新session,同时置sessionid与客户端的会话cookie中 . . . 所以在一个小时内,t1,t2分别生成了100万个session,如果session的默认过期时间为1个小时,则,这个100万个session都存在内存中. 所以session应该是其中的一个原因,但还不是关键原因。 |
|
返回顶楼 | |
发表时间:2008-12-16
解决方案有:
1. nginx采用ip_hash,同一个ip段,定位到同一个tomcat上, 2. 禁用session。 但是我把公共引用的jsp页面设置了 <%@ page session="false" %> ,好像还是能生成session。 现在准备采用HttpSessionListner,一生成session,就把他销毁。 不知道大家还有没有更好的办法,来完全禁用session。tomcat有配置完全禁用session的地方吗? |
|
返回顶楼 | |
发表时间:2008-12-16
dreamlakyxy 写道 解决方案有:
1. nginx采用ip_hash,同一个ip段,定位到同一个tomcat上, 2. 禁用session。 但是我把公共引用的jsp页面设置了 <%@ page session="false" %> ,好像还是能生成session。 现在准备采用HttpSessionListner,一生成session,就把他销毁。 不知道大家还有没有更好的办法,来完全禁用session。tomcat有配置完全禁用session的地方吗? web.xml里面可以设置session过期时间,你可以把过期时间改成1分钟试试看。 |
|
返回顶楼 | |
发表时间:2008-12-16
robbin 写道 dreamlakyxy 写道 解决方案有:
1. nginx采用ip_hash,同一个ip段,定位到同一个tomcat上, 2. 禁用session。 但是我把公共引用的jsp页面设置了 <%@ page session="false" %> ,好像还是能生成session。 现在准备采用HttpSessionListner,一生成session,就把他销毁。 不知道大家还有没有更好的办法,来完全禁用session。tomcat有配置完全禁用session的地方吗? web.xml里面可以设置session过期时间,你可以把过期时间改成1分钟试试看。 恩,也是一种方法 |
|
返回顶楼 | |
发表时间:2008-12-17
最后修改:2008-12-17
dreamlakyxy 写道 困扰了近两月的内存泄露问题终于初见眉目了,罪魁祸首:proxool
生产环境的系统近两个月一直不稳定,过两天内存就会占满,通过jprofiler,jrmc各中方法调试,总是找不到任何原因。 - 能否说说你是如何使用JProfiler的?? 按照我的经验,它是最擅长查这个的。 |
|
返回顶楼 | |
发表时间:2008-12-17
congjl2002 写道 我的系统中也有内存泄漏的问题,但是现在没时间好好查,不过有一次我用jprofer简单查了一下,发现String这个占用内存很大,你是这样的吗?为什么呢
可能是taglib问题: http://xsen.iteye.com/blog/159218 |
|
返回顶楼 | |
发表时间:2008-12-18
Xsen 写道 congjl2002 写道 我的系统中也有内存泄漏的问题,但是现在没时间好好查,不过有一次我用jprofer简单查了一下,发现String这个占用内存很大,你是这样的吗?为什么呢
可能是taglib问题: http://xsen.iteye.com/blog/159218 我把http://xsen.iteye.com/blog/159218的原文引过来了了 引用 最近遇到了Java系统内存泄漏的问题,翻了几遍代码也没看出来问题来。最后怀疑是开源控件的问题,首先想到了Quartz,但最终也没发现太多问题。也看过JProfiler监控的情况,除了String对象占用内存较多以外,也没发现任何其他异常数量的对象。 最后还是老大用jmap和jhat查出了问题,罪魁祸首是taglib,因为我们的页面中使用了taglib,而传入的值是一个拼接了当前时间数的字符串(一个url),而taglib对这些变量有缓存功能,所以每次页面请求taglib都会缓存一个url字符串。具体是放在一个Map类型的静态变量中的,所以当系统运行3天左右内存就爆满了。。。 我也是发现String占用量特别大,经过memleak检查,是发现taglib占用了很多,但是没想到原因。我们也是每个url+一个当前时间的字符串,难道这个影响? 那怎么改呢,很多情况下,如果不拼时间字符串的话,都会缓存的 |
|
返回顶楼 | |
发表时间:2008-12-18
最后修改:2008-12-18
sg552 写道 dreamlakyxy 写道 困扰了近两月的内存泄露问题终于初见眉目了,罪魁祸首:proxool
生产环境的系统近两个月一直不稳定,过两天内存就会占满,通过jprofiler,jrmc各中方法调试,总是找不到任何原因。 - 能否说说你是如何使用JProfiler的?? 按照我的经验,它是最擅长查这个的。 jrmc我用的也不是特别熟。 就是通过jrmc的console和memleak检查的,通过console检查内存,线程,cpu的使用状况,通过memleak检查类实例和说占用的heap的大小,没过一段时间,检查一些,哪些类实例增加的特别大,就右键选择,进行堆栈分配跟踪 不知道sg552 有什么好的建议? |
|
返回顶楼 | |
发表时间:2009-01-15
sdh5724 写道 c3p0吧, 我还是觉得这个最信的过,目前, 经过我们几个星期的连续烧烤,与几年的经验, 基本没有问题。
关于内存问题, JAVA中可以被泄露的问题确实不多, 所以 比起C/C++的排查容易多了, 对于java heap, 你可以使用jmap 直接从生产环境拿下来内leak 分析, 如果很大的内存泄露, 看一眼就知道哪个对象泄露了。 连接POOL的泄露主要表现在, 使用的连接没有归还。要么是已经断开的连接没有释放。 HEAP分析工具对付这些问题切菜才一样。 另外, HEAP 在 DUMP出来的时候, 非live对象可以被排除的, 你看到的结果就是一个干净的, 被引用的对象。 C3P0 不行 你可以google下 对连接的释放速度跟不上 对于并发数量很多的系统就不行 一般系统还是可以的 proxool对连接的管理还是可以的 在大并发量下 对连接的管理很好 |
|
返回顶楼 | |