我在自己的环境中不断检测PermGen中的OOM:

  • Java 6
  • jboss-4.2.3
  • 不是很大的Web应用程序

  • 我知道String.intern()问题-但是我没有足够有值(value)的用法。
    增加MaxPermGen的大小并没有费力(从128 Mb到256 Mb)。

    还有什么其他原因可以为PermGen调用OOM?
    在这种情况下(策略,工具等)哪种调查方案是最佳的?

    谢谢你的帮助

    最佳答案

    See this note

  • 将JDBC驱动程序放在common/lib中(如tomcat文档所说),而不是放在WEB-INF/lib中
  • 不要将commons-logging放入WEB-INF/lib,因为tomcat已经对其进行了引导

  • 新的类对象被放置到PermGen中,因此占据了越来越大的空间。不管您创建PermGen空间有多大,在进行足够的部署后,空间将不可避免地达到顶峰。您需要做的是采取措施冲洗PermGen,以便可以稳定其大小。有两个用于执行此清除操作的JVM标志:
    -XX:+CMSPermGenSweepingEnabled
    

    此设置将PermGen包括在垃圾收集运行中。默认情况下,PermGen空间从不包含在垃圾回收中(因此会无限制地增长)。
    -XX:+CMSClassUnloadingEnabled
    

    此设置告诉PermGen垃圾回收清除对类对象执行操作。默认情况下,即使在垃圾回收期间访问PermGen空间,类对象也将获得豁免。

    关于java - PermGen内存不足的原因,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5635255/

    10-10 21:00