【求助】内存泄漏应该如何解决?

xingyebeijiao 2014-01-17 03:49:44
最近做在一个实时采集的系统,就是说每隔10分钟就对一个网页的内容进行采集,结果发现内存的占用是线性增长的。。

这是使用javavisualVM观察的结果,左边斜坡为采集的过程,所占内存逐渐上升,右边则是等待下一次过程,占用了将近600M的内存无法释放,接下来第二次采集中,内存的使用率会继续上升直到达到最大值。

下面是用memory analyzer得到的两张内存使用的dump图



可以发现classloader占用了大量的资源,小弟不知道应该怎么把这些资源释放出来。请问各位大神这个问题应该如何解决?

谢谢各位的回答!!!
...全文
996 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingyebeijiao 2014-02-09
  • 打赏
  • 举报
回复
非常感谢以上各位的回答!! 我是LZ,问题已经解决了,我将程序重新写了一遍,每写一部分就测试一下,结果发现问题出现在hibernate持久化部分,具体就是SessionFactory开启太多导致的。SessionFactory是一个重量级单位,所以只实例化一次就好了。改完之后,程序只占很低的内存,而且采集的效率也上升了! 说到底还是自己的学习不到位,再次感谢各位的回答!
jdgdf566 2014-01-21
  • 打赏
  • 举报
回复
第二次采集中,内存的使用率会继续上升直到达到最大值。应该可以确定是发生了内存溢出。
jdgdf566 2014-01-21
  • 打赏
  • 举报
回复
就像前面几位说的,最大的可能是有对象没有删除引用
  • 打赏
  • 举报
回复
我还以为楼主要自己改一下classloader呢.
  • 打赏
  • 举报
回复
从图形中看不出什么地方有内存泄漏啊?一个 Java Web 应用(含 Servlet 容器)占用 1GB 的内存是正常的。
kakashi8841 2014-01-19
  • 打赏
  • 举报
回复
用JDK自带的jmap(bin目录下)查看当前进程里面每个对象的占用情况,然后截图发出来看看。jmap用法自己查。
无聊找乐 2014-01-19
  • 打赏
  • 举报
回复
用jprofiler 跟一下
lcf 2014-01-17
  • 打赏
  • 举报
回复
首先你是个网页程序,那个class loader是tomcat用来加载你的网页程序的,所以在你程序里所有占用的内存最终都会反映到那个class loader上面去。于是乎它是最大的占用者,但这没有意义。 你在代码里面搜索"new"关键字,看看这些新建的对象都到哪里去了。这可能是个大工程,不过对你理解熟悉代码很有帮助
nature502 2014-01-17
  • 打赏
  • 举报
回复
应该是HashMap放入了数据,没有remove,导致的内存泄露
致知Fighting 2014-01-17
  • 打赏
  • 举报
回复
你把你的采集逻辑画个流程图出来吧,如果是真的是出现了内存长久不释放的情况,肯定是你的逻辑有问题
xingyebeijiao 2014-01-17
  • 打赏
  • 举报
回复
引用 9 楼 ygycomon 的回复:
[quote=引用 4 楼 xingyebeijiao 的回复:] [quote=引用 3 楼 ygycomon 的回复:] 我看你这个曲线,到后面是处于平稳的状态,并不是一直在上升嘛
感谢回复! 因为这个程序是每个一段时间采集一次,后面平稳是因为采集的线程使用了sleep正在休眠,等待下一次的采集。。。一旦下一次的采集开始,还是会继续增长[/quote] 你说的下一次采集开始内存增长,但是在你给出的图表里,从15:20-15:40这段时间里的两次采集都没有出现大角度的上升情况[/quote] 感谢回复! 十分不好意思,是我个人偷懒了,这个图是我把循环取消之后测试的,目的是看只采集一次的情况下,虚拟机能否把多出来的那些资源回收掉,结果等了很长时间也没有回收,不好意思,我的懒惰造成了您的误解!
致知Fighting 2014-01-17
  • 打赏
  • 举报
回复
引用 4 楼 xingyebeijiao 的回复:
[quote=引用 3 楼 ygycomon 的回复:] 我看你这个曲线,到后面是处于平稳的状态,并不是一直在上升嘛
感谢回复! 因为这个程序是每个一段时间采集一次,后面平稳是因为采集的线程使用了sleep正在休眠,等待下一次的采集。。。一旦下一次的采集开始,还是会继续增长[/quote] 你说的下一次采集开始内存增长,但是在你给出的图表里,从15:20-15:40这段时间里的两次采集都没有出现大角度的上升情况
xingyebeijiao 2014-01-17
  • 打赏
  • 举报
回复
引用 6 楼 fangmingshijie 的回复:
如何交互的?
感谢您的回复! 不过我才是个JAVA新手,可能不太理解您的意思,您的意思是问如何采集的吗? 这是一个使用新浪微博API采集的,数据库是mysql,还使用了hibernate组件
致知Fighting 2014-01-17
  • 打赏
  • 举报
回复
那就跟你采集程序的逻辑有关系了,你画个流程图出来分析分析呗
zhangchengtest 2014-01-17
  • 打赏
  • 举报
回复
同意楼上的意见
  • 打赏
  • 举报
回复
如何交互的?
xingyebeijiao 2014-01-17
  • 打赏
  • 举报
回复
引用 3 楼 ygycomon 的回复:
我看你这个曲线,到后面是处于平稳的状态,并不是一直在上升嘛
感谢回复! 因为这个程序是每个一段时间采集一次,后面平稳是因为采集的线程使用了sleep正在休眠,等待下一次的采集。。。一旦下一次的采集开始,还是会继续增长
致知Fighting 2014-01-17
  • 打赏
  • 举报
回复
我看你这个曲线,到后面是处于平稳的状态,并不是一直在上升嘛
xingyebeijiao 2014-01-17
  • 打赏
  • 举报
回复
引用 1 楼 ygycomon 的回复:
加大内存。。。
感谢你的回复,但是加大内存只能说是下策。。。所需要的内存不断增长的话是个很大的隐患啊,系统太不稳定了。。。
致知Fighting 2014-01-17
  • 打赏
  • 举报
回复
加大内存。。。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧