我在运行 ~300 个 JUnit 测试并使用 Spring 上下文时看到“java.lang.OutOfMemoryError: PermGen space”。很难弄清楚是什么吞噬了 PermGen,因为:
- 在稳定状态下,应用程序消耗大约 90m 的 permgen 空间
- 我已经尝试过 -XX:MaxPermSize=256m 进行单元测试 - 仍然用完
-XX:+TraceClassLoading
启用和-XX:+TraceClassUnloading
启用后,在OutOfMemoryError
.
后者似乎表明除了 Class 对象之外的东西正在填充 PermGen,不是吗?如果是这样,那会是什么?例如,是否存在类实例存储在 PermGen 中的情况?
这是我的虚拟机信息:
$ 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)
有关的
FWIW,导致这篇文章的问题的根源结果有点微不足道:我假设 Maven Surefire 插件在分叉 VM 时从 MAVEN_OPTS(或运行 mvn 的 VM 实例)继承 VM 设置 -它没有(嘘)。必须在插件的配置中明确指定使用 argLine 的那些。HTH。