我们的后台项目刚做了数据库连接池和其他的一些优化,但是现在出现一个问题,就是项目一启动,内存不断增大,直到内存溢出。请问这是和什么有关呢??
[img]http://dl.iteye.com/upload/attachment/0076/8946/8fb14335-8d9c-3ea8-952b-668cf747a4fd.jpg[/img]
导致内存溢出的原因有很多,但一般情况不外乎两种:
(1) jvm初始化是给的内存太小;
(2) 应用程序创建的对象太庞大,使jvm堆栈上升;
(3) 查询数据时,因数据量太大,造成内存使用率过高;
从楼主给的图片来看,内存到70Mb,tomcat启动是配置的jvm有点小,tomcat默认启动内存为125Mb,一般小型项目应付的了,但是大型项目就得增加内存;
楼主可尝试增大jvm的大小,
参考下
http://zhengshuo.iteye.com/blog/1531005
检查一下项目逻辑吧,看看有没有逻辑上的疏忽,资源在用过之后没有关闭。导致在运行过程中 没及时关闭的资源越来越多 最终导致内存溢出
在即将溢出的时候,用jstack查看以下有哪些线程在工作。这样的目的是定位哪里的代码导致的内存溢出。
一半来说 内存溢出是创建大对象导致的,可以看下你项目中是否有创建大数组类型的对象。如果有的话,注意要设置空建议JVM回收或者使用其他替代方案。如果找不出来的话,可以使用jdk的bin目录下的jmap下载快要down掉的时候的内存对象图,然后使用指定的软件(如eclipse的一个叫analyser的,貌似)分析,图形化大对象,然后基本上就可以查询出大对象的方位了,同时通过jstack来查线程信息。基本上可以定位到是什么对象持续增加导致未回收而内存溢出的。
建议用JProfier监控一下哪些对象没有被释放(被其他地方引用了)。
看一下你容器在启动时设定xms,xmx这些参数,如果你jvm分配的内存超过你机器物理内存的占比也会报错的。
应该是某处代码编写得有问题,看下是不是有大型报表之类的
先确定是否有内存溢出 可以手动垃圾回收看是否可以回到初始值 如果可以回到初始值 代码本身是没问题的 如果回不去 那么代码肯定有问题 可以通过以下方式查找问题代码
查查静态变量..list or sringbuilder.这些玩意...
一个图,看不出什么东西。建议出个详细点的!
查代码;查session;描述应用场景;
一些提示:
[url]http://www.iteye.com/problems/87806[/url]
哥们,用的什么工具查看的
堆内存只增不减应该是没有进行垃圾回收,可以调整下jvm的配置!
你可以先增大一下服务器的堆内存试试,如果项目启动内存还是溢出的话,那应该是程序的问题,可以考虑用压力测试工具检查一下,看看大概那个部分由问题,然后再检查代码,估计是有些变量没有释放导致的
要看下内存一直增大是在启动过程中还是在启动完后接受请求的时候。
如果是启动过程中一直增大是正常的(可能在不断地加载类工业基础初始化一些东西),如果溢出了你就加大内在参数。
如果启动完后停止在一个固定的内存值,然后随着接受请求数增加内存也不断加大就可以确定是内存泄漏了。可以用jProfiler检查。
通过使用内存监控工具。例如jprofile来监控内存,启动时做上内存标记。才内存试图查看是那个对象占有内存比较大。检查业务逻辑,是否有资源未回收情况,例如,io,数据连接等,添加jvm参数-XX:+HeapDumpOnOutOfMemoryError,生成内存影像,分析。
检查一下项目逻辑吧,看看有没有逻辑上的疏忽,资源在用过之后没有关闭。导致在运行过程中 没及时关闭的资源越来越多 最终导致内存溢出
建议你专注于对象的循环引用这一块,看看是否有这方面的错误,可以用JProfier工具查找引用情况。
将内存使用情况导出来进行分析,看看是不是程序的问题
比如大的循环中使用String来接收数据等等