什么,除了Class对象,存储在Perm Gen Space(sun 1.6 VM)中?

Nik*_*ita 15 java jvm out-of-memory permgen maven-surefire-plugin

我在运行~300 JUnit测试并使用Spring上下文时看到'java.lang.OutOfMemoryError:PermGen space'.从那时起,我很难搞清楚PermGen吃了什么东西:

  • 在稳定的状态下,该应用程序消耗约90米的permgen空间
  • 我已经尝试-XX:MaxPermSize = 256m进行单元测试 - 仍然用完了
  • 使用-XX:+TraceClassLoading-XX:+TraceClassUnloading启用后,我会在执行最后20-30次测试之前看到没有其他"加载"事件OutOfMemoryError.

后者似乎表明除了Class对象之外的东西正在填充PermGen,不是吗?如果是这样,它会是什么?例如,是否存在类实例存储在PermGen中的情况?

这是我的VM信息:

$ java -version
java version "1.6.0_25"
Java(TM) SE Runtime Environment (build 1.6.0_25-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.0-b11, mixed mode)
Run Code Online (Sandbox Code Playgroud)

有关

FWIW,我的问题的根源促成了这篇文章,结果有些微不足道:我假设Maven Surefire插件在MAfor_OPTS(或运行mvn的虚拟机实例)的情况下从虚拟机中继承VM设置 - 它没有(boo).必须在插件的配置中明确指定使用argLine的那些.HTH.

mik*_*era 4

有时滥用String.intern()可能会导致 PermGen 空间不足错误,因为 interned String 实例存储在 PermGen 中。

这可能就是您所看到的 - 尝试消除不必要的 String.intern() 调用,看看这是否可以解决问题。一般来说,我不建议使用 String.intern() ,除非您确定以下两条都是正确的:

  • 您确定只会添加有限数量的字符串
  • 您实际上需要这样的字符串来共享相同的对象标识(例如,如果相同字符串的许多实例会消耗不可接受的内存量,或者出于复杂的性能原因,您需要依赖 == 进行字符串比较)