论坛首页 Java企业应用论坛

困扰了近两月的内存泄露问题终于初见眉目了,罪魁祸首:proxool

浏览 33750 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-15  
nickxu 写道
xucons 写道
很有可能是THREAD LOCAL引起的,要注意threadlocal的使用要清空。

我想问一下ThreadLocal的内容不是线程结束后自动被jvm回收吗?需要手动清空?

我查了一下,好像不需要的
0 请登录后投票
   发表时间: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应该是其中的一个原因,但还不是关键原因。
0 请登录后投票
   发表时间:2008-12-16  
解决方案有:
1. nginx采用ip_hash,同一个ip段,定位到同一个tomcat上,
2. 禁用session。
但是我把公共引用的jsp页面设置了 <%@ page session="false" %> ,好像还是能生成session。

现在准备采用HttpSessionListner,一生成session,就把他销毁。

不知道大家还有没有更好的办法,来完全禁用session。tomcat有配置完全禁用session的地方吗?
0 请登录后投票
   发表时间: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分钟试试看。
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分钟试试看。

恩,也是一种方法
0 请登录后投票
   发表时间:2008-12-17   最后修改:2008-12-17
dreamlakyxy 写道
困扰了近两月的内存泄露问题终于初见眉目了,罪魁祸首:proxool

生产环境的系统近两个月一直不稳定,过两天内存就会占满,通过jprofiler,jrmc各中方法调试,总是找不到任何原因。

-


能否说说你是如何使用JProfiler的??

按照我的经验,它是最擅长查这个的。
0 请登录后投票
   发表时间:2008-12-17  
congjl2002 写道
我的系统中也有内存泄漏的问题,但是现在没时间好好查,不过有一次我用jprofer简单查了一下,发现String这个占用内存很大,你是这样的吗?为什么呢


可能是taglib问题: http://xsen.iteye.com/blog/159218
0 请登录后投票
   发表时间: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+一个当前时间的字符串,难道这个影响?

那怎么改呢,很多情况下,如果不拼时间字符串的话,都会缓存的

0 请登录后投票
   发表时间:2008-12-18   最后修改:2008-12-18
sg552 写道
dreamlakyxy 写道
困扰了近两月的内存泄露问题终于初见眉目了,罪魁祸首:proxool

生产环境的系统近两个月一直不稳定,过两天内存就会占满,通过jprofiler,jrmc各中方法调试,总是找不到任何原因。

-


能否说说你是如何使用JProfiler的??

按照我的经验,它是最擅长查这个的。


jrmc我用的也不是特别熟。

就是通过jrmc的console和memleak检查的,通过console检查内存,线程,cpu的使用状况,通过memleak检查类实例和说占用的heap的大小,没过一段时间,检查一些,哪些类实例增加的特别大,就右键选择,进行堆栈分配跟踪

不知道sg552 有什么好的建议?
0 请登录后投票
   发表时间:2009-01-15  
sdh5724 写道
c3p0吧, 我还是觉得这个最信的过,目前, 经过我们几个星期的连续烧烤,与几年的经验, 基本没有问题。 

关于内存问题, JAVA中可以被泄露的问题确实不多, 所以 比起C/C++的排查容易多了, 对于java heap, 你可以使用jmap 直接从生产环境拿下来内leak 分析, 如果很大的内存泄露, 看一眼就知道哪个对象泄露了。

连接POOL的泄露主要表现在, 使用的连接没有归还。要么是已经断开的连接没有释放。 HEAP分析工具对付这些问题切菜才一样。 另外, HEAP 在 DUMP出来的时候, 非live对象可以被排除的, 你看到的结果就是一个干净的, 被引用的对象。

C3P0 不行 你可以google下 对连接的释放速度跟不上 对于并发数量很多的系统就不行 一般系统还是可以的  proxool对连接的管理还是可以的 在大并发量下 对连接的管理很好
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics