java.exe占用的内存越来越多……直到出现java.lang.OutOfMemoryErr...
最近才发现TOMCAT启动一段时间后,总是出现java.lang.OutOfMemoryError PermGen space这个错误,后来搜索到答案称:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。根据提示,修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
仍然不行。
打开任务管理器查看内存使用情况,发现,刚启动TOMCAT时JAVA.EXE使用内存在35M左右,后打开网页浏览,每点一个链接JAVA.EXE占用的内存不断增加,不会降低,即便是关闭所有浏览页内存也不会降,当内存占到140多M时出现java.lang.OutOfMemoryError PermGen space这个错误,我想内存占用不应该只增不降,应该是本人代码的问题,但不知如何下手去查,请各位老师指点,谢谢了……
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
你先用jvisualvm之类的工具看下,把场景发出来看看,不然我们只能猜啊!
非常感谢大家的指点,虽然有些还看不懂^_^,不过我边学边试一下,谢谢了哈……
引用来自#6楼“SeekerLee”的帖子
引用来自#5楼“YiChen”的帖子
我们是一般会每天重启一次tomcat释放一下内存
在高点击的情况下 Tomcat会输出这个异常,估计是最后有什么资源没有回收
java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:448)
at java.util.AbstractList$Itr.remove(AbstractList.java:433)
at java.util.AbstractCollection.remove(AbstractCollection.java:255)
at org.apache.coyote.RequestGroupInfo.removeRequestProcessor(RequestGroupInfo.java:17)
at org.apache.coyote.RequestInfo.setGlobalProcessor(RequestInfo.java:96)
at org.apache.coyote.http11.Http11Protocol$MXPoolListener.threadEnd(Http11Protocol.java:620)
at org.apache.tomcat.util.threads.ThreadPool.removeThread(ThreadPool.java:279)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:727)
at java.lang.Thread.run(Thread.java:534)
引用来自#5楼“YiChen”的帖子
我们是一般会每天重启一次tomcat释放一下内存
在高点击的情况下 Tomcat会输出这个异常,估计是最后有什么资源没有回收
java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:448)
at java.util.AbstractList$Itr.remove(AbstractList.java:433)
at java.util.AbstractCollection.remove(AbstractCollection.java:255)
at org.apache.coyote.RequestGroupInfo.removeRequestProcessor(RequestGroupInfo.java:17)
at org.apache.coyote.RequestInfo.setGlobalProcessor(RequestInfo.java:96)
at org.apache.coyote.http11.Http11Protocol$MXPoolListener.threadEnd(Http11Protocol.java:620)
at org.apache.tomcat.util.threads.ThreadPool.removeThread(ThreadPool.java:279)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:727)
at java.lang.Thread.run(Thread.java:534)
我们是一般会每天重启一次tomcat释放一下内存
在高点击的情况下 Tomcat会输出这个异常,估计是最后有什么资源没有回收
java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:448)
at java.util.AbstractList$Itr.remove(AbstractList.java:433)
at java.util.AbstractCollection.remove(AbstractCollection.java:255)
at org.apache.coyote.RequestGroupInfo.removeRequestProcessor(RequestGroupInfo.java:17)
at org.apache.coyote.RequestInfo.setGlobalProcessor(RequestInfo.java:96)
at org.apache.coyote.http11.Http11Protocol$MXPoolListener.threadEnd(Http11Protocol.java:620)
at org.apache.tomcat.util.threads.ThreadPool.removeThread(ThreadPool.java:279)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:727)
at java.lang.Thread.run(Thread.java:534)
http://www.brokenbuild.com/blog/2006/08/04/java-jvm-gc-permgen-and-memory-options/
和你的问题应该一致。跟踪类的载入情况,看是否一直有新的类产生。
内存溢出
1、检查代码是否open了本地IO,而且没有及时release
2、检查代码是否存在不合理的递归程序
3、文件(图片)上传程序是否有问题?
4、应用是否包含了较大的对象(如包含超大文本),而且被单例实例持续引用着
5、最后用JProfile跟踪下类的实例引用情况
6、最笨的办法就是停止所有功能,然后逐个加上去并排查。