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 来解决这个问题。但我担心我在掩盖我的问题。
我的问题是:
我认为 PermGen 存储了 class 元数据。我可以理解在编译代码时我可能会用完 PermGen space。但在这种情况下,我没有在机器上编译代码,这个错误让我在运行上述应用程序几分钟后遇到了问题。为什么?
我是否采用了正确的方法来处理 PermGen space 错误?是
有为使用 Spray-Can 运行的应用程序推荐的 JVM 标志吗?
使用CMSClassUnloadingEnabled时,是否还需要使用Java7中的UseConcMarkSweepGC?这个问题
(CMSPermGenSweepingEnabled vs CMSClassUnloadingEnabled)
似乎表明它适用于 Java 6.
框架中的某些东西——或者无论如何您的代码——可能正在动态创建 classes(代理等)。我建议您在 运行 一段时间后,或者最好在 OutOfMemoryError 崩溃后分析应用程序的堆转储。有关如何创建转储的说明可以在我的 this 博客 post 中找到。分析说明可能仅部分适用于您的情况。在您发现什么 正在填充 PermGen 后,我们可以尝试确定它是否是需要 fixed/prevented 的泄漏,或者您的应用程序是否只是很大。
是的,要使 -XX:+CMSClassUnloadingEnabled 生效,您还需要使用 -XX:+UseConcMarkSweepGC 启用并发标记和清除垃圾收集器。然而,默认 GC(通常是旧 JVM 中的 Parallell 和较新 1.7+ 中的 G1)默认执行 class 卸载,即使 Parallell GC 中似乎存在与此相关的错误。
我有一个大型 Spray API 编写了大约 60-70 个端点,我使用 spray-can HTTP 服务器在 Java 7 上运行它。同时运行大量针对它的自动端到端测试,我收到了 java.lang.OutOfMemoryError: PermGen space 错误。
我设法通过强制卸载 classes(使用 -XX:+CMSClassUnloadingEnabled)、将 Max PermGen 大小增加到 1024m 并将线程堆栈大小设置为 2m 来解决这个问题。但我担心我在掩盖我的问题。
我的问题是:
我认为 PermGen 存储了 class 元数据。我可以理解在编译代码时我可能会用完 PermGen space。但在这种情况下,我没有在机器上编译代码,这个错误让我在运行上述应用程序几分钟后遇到了问题。为什么?
我是否采用了正确的方法来处理 PermGen space 错误?是 有为使用 Spray-Can 运行的应用程序推荐的 JVM 标志吗?
使用CMSClassUnloadingEnabled时,是否还需要使用Java7中的UseConcMarkSweepGC?这个问题 (CMSPermGenSweepingEnabled vs CMSClassUnloadingEnabled) 似乎表明它适用于 Java 6.
框架中的某些东西——或者无论如何您的代码——可能正在动态创建 classes(代理等)。我建议您在 运行 一段时间后,或者最好在 OutOfMemoryError 崩溃后分析应用程序的堆转储。有关如何创建转储的说明可以在我的 this 博客 post 中找到。分析说明可能仅部分适用于您的情况。在您发现什么 正在填充 PermGen 后,我们可以尝试确定它是否是需要 fixed/prevented 的泄漏,或者您的应用程序是否只是很大。
是的,要使 -XX:+CMSClassUnloadingEnabled 生效,您还需要使用 -XX:+UseConcMarkSweepGC 启用并发标记和清除垃圾收集器。然而,默认 GC(通常是旧 JVM 中的 Parallell 和较新 1.7+ 中的 G1)默认执行 class 卸载,即使 Parallell GC 中似乎存在与此相关的错误。