2

为企业级应用程序运行 Tomcat。收到“Permgen 内存不足”消息。

我正在运行这个:

Windows 2008 R2 服务器,Java 1.6_43,将 Tomcat 作为服务运行。

没有多次部署。服务启动,App 运行。最终我得到 Permgen 错误。

我可以通过增加烫发大小来延迟错误,但是我想实际解决这个问题。供应商否认这个问题。我不知道这是否是内存泄漏,因为供应商只是说“使用 Jrockit 运行良好”。Ofc,就像 3mos 前那样,在文档中会很好。另外,一些帖子建议 Jrockit 只是扩展 permspace 以适应,如果你有 mem 最多 4gb(不确定这是否准确......)。

无论如何,我看到一些帖子在 Java 1.5 中使用选项“-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled”进行潜在修复

但是,这些似乎在 Java 1.6 中已被弃用,现在唯一可用的 GC 似乎是“-XX:+UseG1GC”。

我能在任何地方找到的最佳链接是: http ://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options

有谁知道新的 G1 垃圾收集器是否包含永久空间?还是我在新的 Java6 GC 设置中遗漏了一个或 2 个可能我不理解的选项?

任何帮助表示赞赏!

4

2 回答 2

1

我不会仅仅增加 permgen 空间,因为这个错误通常是软件/设置出现问题的迹象。他们是导致这种情况的特定网络应用程序吗?没有更多信息,我只能提供基本建议。

1) 使用名为Find Leaks的内存泄漏检测器 (Tomcat 6+)

2)关闭自动部署

3) 根据此博客条目,将 JDBC 驱动程序和日志记录软件移动到 java 类路径而不是 tomcat

于 2013-07-22T19:08:10.770 回答
0

在 Sun Java 1.6 的早期版本中,该CMSPermGenSweepingEnabled选项只有在UseConcMarkSweepGC也设置时才有效。请参阅以下答案:

我不知道它是否在 1.6 的更高版本中起作用。

过去这些错误/错误的常见原因是动态类生成,特别是对于创建动态代理或使用方面的库和框架。对 Spring 和 Hibernate(或者更具体地说是 cglib 和/或 aspectj)的轻微滥用是常见的罪魁祸首。潜在的问题是每个请求都会创建新的动态类,最终耗尽 permgen 空间。CMSPermGenSweepingEnabled 选项是一种常见的解决方法/修复。这些框架的最新版本不再存在问题。

于 2013-07-22T19:09:48.653 回答