【问题标题】:java.lang.OutOfMemoryError: PermGen space [closed]java.lang.OutOfMemoryError:PermGen 空间 [关闭]
【发布时间】:2011-04-14 05:26:07
【问题描述】:

我在 Eclipse IDE 3.2 中经常出现以下错误,如何从这些 OutOfMemory 中保存应用程序?

java.lang.OutOfMemoryError: PermGen space
    java.lang.ClassLoader.defineClass1(Native Method)
    java.lang.ClassLoader.defineClassCond(Unknown Source)
    java.lang.ClassLoader.defineClass(Unknown Source)
    java.security.SecureClassLoader.defineClass(Unknown Source)
    org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1814)
    org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872)
    org.jboss.web.tomcat.service.WebAppClassLoader.findClass(WebAppClassLoader.java:75)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
    com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:289)
    java.sql.DriverManager.getConnection(Unknown Source)
    java.sql.DriverManager.getConnection(Unknown Source)
    org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133)
    org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:111)
    org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2101)
    org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1325)
    com.mfic.util.HibernateUtil.<clinit>(HibernateUtil.java:16)
    com.mfic.dao.BaseHome.getSession(BaseHome.java:16)
    com.mfic.core.helper.UserManager.findByUserId(UserManager.java:248)
    com.mfic.core.action.Login.authenticate(Login.java:39)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)

【问题讨论】:

标签: java eclipse memory jvm initialization


【解决方案1】:

如果您在辅助 Eclipse 应用程序中遇到问题错误,在 ini 中添加 -XX:MaxPermSize=512m 将无济于事。您需要进入 debug or run configuration-&gt;arguments 并将该部分添加到 VM 参数中。我还增加了其他内存限制:

-Dosgi.requiredJavaVersion=1.5 -Xms120m -Xmx2048m -XX:MaxPermSize=1024m

它有帮助。

编辑。经过我发现的一些实验,Eclipse 确实从 ini 文件中获取了内存限制。但是......它只做一次,在创建一个新的工作空间时。来自 eclipse.ini 中 -vmarg 的参数创建默认的 VM 参数行。因此,如果您正在使用现有工作区,请更改调试或运行配置。但为了更好的未来,也要更改 eclipse.ini。

【讨论】:

  • -XX:MaxPermSize=512m 绰绰有余。
  • @pro_cheats 已经有人告诉过 640k 内存足以应付一切……不要以为整个世界都仅限于您的任务。我们正在讨论编写向导——在 Eclipse 中启动在 Eclipse 中启动的应用程序。即使在 2012 年,512M 也绝对不够。现在 Eclipse 变得更大,可能会占用更多内存。
  • -Xms120m -Xmx2048m -XX:MaxPermSize=1024m 工作
【解决方案2】:

您的项目会占用大量内存。为 Eclipse 提供更多内存以供使用。编辑eclipse.ini 以在-vmargs 下方修改或添加以下行。

-Xms256m -Xmx512m -XX:MaxPermSize=512m

假设您至少有 2GB 的 RAM。

另见:

【讨论】:

  • 您的解决方案似乎只是一个临时解决方案,如何解决底层问题,并使用更少的 permgen 空间?
  • @Grae:分析代码并改进它。如果它无法改进并且这些内存分配只是为了运行您的代码而强制执行的,那么只需给它更多内存。就这么简单。
【解决方案3】:
  • 点击服务器实例。
  • 打开启动配置。
  • 在参数选项卡中为 JVM 增加内存。

-Xms64m -Xmx256m

见下图:

【讨论】:

    【解决方案4】:

    Java 应用程序只能使用有限的内存量。您的特定应用程序可以使用的确切内存量是在应用程序启动期间指定的。为了让事情变得更复杂,Java 内存被分成不同的区域,其中一个区域称为 PermGen。

    所有这些区域的大小都是在 JVM 启动期间设置的。如果您没有明确设置大小,将使用特定于平台的默认值。

    所以 - java.lang.OutOfMemoryError: PermGen space 消息表明 内存中的永久大小区域已用完

    这个称为 PemGen 的特定区域是加载和存储 Java 类的专用区域。这包括以下内容:

    • 类的名称
    • 类的字段
    • 具有方法字节码的类的方法
    • 常量池信息
    • 与类关联的对象数组和类型数组
    • 即时编译器优化

    差不多就是这样。还有一些零碎的东西,但对实际内存消耗的影响不会超过百分之几。所有这些都分配在永久代中,并留在永久代中。

    如您所见,永久代大小要求取决于加载的类的数量以及此类声明的大小。因此很容易看出导致此类错误的主要原因:加载到永久代的类太多或太大

    症状的快速修复很容易 - 如果我们用尽了堆中的 PermGen 区域,我们需要增加它的大小。如果只是没有给你的 JVM 足够的空间,这个解决方案确实很有帮助。因此,请更改您的应用程序启动配置并添加(或增加)以下内容:

    -XX:MaxPermSize=512m
    

    【讨论】:

    • 为什么是 512m?有什么理由为什么很多例子都给出了这个大小?
    【解决方案5】:

    在调试会话等期间在 Eclipse 中运行 Tomcat 时,这种情况经常发生。从内存来看,这是 Sun JVM 的问题。 Annnyway,有一个简单的解决方法:

    只需在 eclipse.ini 中的 -vmargs 下方添加以下内容(与 eclipse 二进制文件位于同一目录中):

    -XX:+UseConcMarkSweepGC
    -XX:+CMSClassUnloadingEnabled
    -XX:+CMSPermGenSweepingEnabled 
    

    这将在运行 Eclipse 时实现更积极的垃圾收集,并且是一个比仅仅在 Eclipse 上投入更多 RAM 更优雅的解决方案。

    希望这会有所帮助!

    【讨论】:

      【解决方案6】:

      上面的答案可能会为您解决,但无论如何这里有一些有趣的相关链接:

      这是一篇关于这个错误有很多讨论和建议的文章: http://www.jroller.com/agileanswers/entry/preventing_java_s_java_lang

      讨论 Permgen OOM 错误如何发生的示例: http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

      这是一个实际的解决方案,最近发布在 StackOverflow 上。 它适用于 Tomcat,但可能在 Eclipse 中可用: Dealing with "java.lang.OutOfMemoryError: PermGen space" error

      【讨论】:

        【解决方案7】:

        在您的eclipse.ini 中增加您的MaxPermSize。如果您对 RAM 感到满意,我建议将其设置为 128M 或 256M

        -vmargs -XX:PermSize=64M -XX:MaxPermSize=128M  
        

        还请注意,正如Perm-Gen Errors Got You Down? 中所报告的,许多人在使用 Eclipse 3.2 时遇到了 PermGen 问题。由于 Eclipse 3.2 已有 4 年多的历史,我建议升级到更新的版本(Eclipse 3.6 是当前版本)。

        参考文献

        【讨论】:

          【解决方案8】:

          在尝试上述选项后,请检查更新的 JVM。 我正在使用 jdk1.6 并面临同样的问题。 当我将eclipse中的jvm改成JDK1.7时,它工作正常。

          【讨论】:

          • 谢谢你救了我,这对我有用:)
          猜你喜欢
          • 2013-09-01
          • 2012-10-21
          • 2011-07-28
          • 2012-08-05
          • 1970-01-01
          • 1970-01-01
          • 2014-04-17
          • 2015-05-11
          • 1970-01-01
          相关资源
          最近更新 更多