Spray:运行时部署实例上的 PermGen 内存不足错误

Spray: PermGen out-of-memory errors on deployed instance during runtime

我有一个大型 Spray API 编写了大约 60-70 个端点,我使用 spray-can HTTP 服务器在 Java 7 上运行它。同时运行大量针对它的自动端到端测试,我收到了 java.lang.OutOfMemoryError: PermGen space 错误。

我设法通过强制卸载 classes(使用 -XX:+CMSClassUnloadingEnabled)、将 Max PermGen 大小增加到 1024m 并将线程堆栈大小设置为 2m 来解决这个问题。但我担心我在掩盖我的问题。

我的问题是:

框架中的某些东西——或者无论如何您的代码——可能正在动态创建 classes(代理等)。我建议您在 运行 一段时间后,或者最好在 OutOfMemoryError 崩溃后分析应用程序的堆转储。有关如何创建转储的说明可以在我的 this 博客 post 中找到。分析说明可能仅部分适用于您的情况。在您发现什么 正在填充 PermGen 后,我们可以尝试确定它是否是需要 fixed/prevented 的泄漏,或者您的应用程序是否只是很大。

是的,要使 -XX:+CMSClassUnloadingEnabled 生效,您还需要使用 -XX:+UseConcMarkSweepGC 启用并发标记和清除垃圾收集器。然而,默认 GC(通常是旧 JVM 中的 Parallell 和较新 1.7+ 中的 G1)默认执行 class 卸载,即使 Parallell GC 中似乎存在与此相关的错误。