为企业级应用程序运行Tomcat。得到了“Permgen内存不足”的消息。
我正在运行:
Windows 2008 R2服务器, Java 1.6_43, 将Tomcat作为服务运行。
无多重部署。服务已启动,App正在运行。最终我得到了Permgen错误。
我可以通过增加perm大小来延迟错误,但是我想实际解决这个问题。供应商不承认这个问题。我不知道它是否是内存泄漏,因为供应商简单地说“与Jrockit运行良好”。 Ofc,这在文档中很不错,就像3mos之前一样。另外,一些帖子表明Jrockit只是扩展了permspace以适应,如果你有mem(不确定是准确的......),最高可达4gb。
无论如何,我在Java 1.5中看到了一些可能修复的帖子 “-XX:+ CMSClassUnloadingEnabled -XX:+ CMSPermGenSweepingEnabled”
但是,这些似乎已在Java 1.6中弃用,现在唯一可用的GC是“-XX:+ UseG1GC”。
我能在任何地方找到的最佳链接是: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options
有没有人知道新的G1垃圾收集器是否包含permspace?或者我在新的Java6 GC设置中错过了一个选项或2,可能我不理解?
任何帮助表示赞赏!
答案 0 :(得分:1)
我不会只增加permgen空间,因为此错误通常是软件/设置中出现错误的迹象。他们是一个特定的webapp导致这个?没有更多信息,我只能提供基本建议。
1)使用名为Find Leaks
的内存泄漏检测器(Tomcat 6+)2)关闭自动部署
3)将JDBC驱动程序和日志记录软件移至java类路径而不是tomcat per this博客条目
答案 1 :(得分:0)
在早期版本的Sun Java 1.6中,CMSPermGenSweepingEnabled
选项仅在设置了UseConcMarkSweepGC
时才起作用。看到这些答案:
我不知道它是否在1.6的后续版本中有效。
过去这些错误/错误的常见原因是动态类生成,特别是对于创建动态代理或使用方面的库和框架。微妙地滥用Spring和Hibernate(或者更具体地说是cglib和/或aspectj)是常见的罪魁祸首。潜在的问题是每个请求都会创建新的动态类,最终耗尽了permgen空间。 CMSPermGenSweepingEnabled选项是常见的解决方法/修复。这些框架的最新版本不再存在问题。