java - ClassLoader 泄漏——它们值得解决吗?

标签 java classloader memory-leaks application-server

ClassLoader 泄漏通常会导致 java.lang.OutOfMemoryError: PermGen。在应用程序服务器上工作的实例中,您可能会看到这是对一个公共(public)应用程序进行多次重新部署的结果。可以在这两个链接上看到对此问题的解释和可能的解决方案。 (等等)

http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/17/the-unknown-generation-perm/

现在,在大多数情况下,它们很容易绕过。只需增加 -XX:MaxPermSize,当不可避免的情况发生时,完全重新启动 JVM。试图解决这个问题的问题是,在大型应用程序中,许多类可能会导致类加载器泄漏,从而使类保留在 permgen 中。

由此产生两个问题:

是否可以合理地说像这样的问题只增加最大 perm 大小并在必要时重新启动更好,或者应该更优先考虑解决方案?

是否有更简单的方法来解决类加载器泄漏?

最佳答案

这实际上取决于应用程序,或者更确切地说,取决于所使用的部署过程。许多应用程序仅在开发期间才重新部署,新版本每隔几个月发布一次,并且应用程序服务器因其他原因重新启动的频率远远超过应用程序的部署频率。在那种情况下,追查类加载器泄漏是浪费时间。

当然,如果您计划实现 continuous deployment process ,尤其是在高可用性环境中,那么 Classloader 泄漏是您真正需要解决的问题。但在这成为问题之前,您还需要比大多数项目做得更好的许多其他事情。

关于java - ClassLoader 泄漏——它们值得解决吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4742050/

相关文章:

java - 使用自定义类加载器加载资源包

java - 在不接触代码的情况下替换实例化类的实现(java)

C 字符 ** 导致内存泄漏

.net - .Net Concurrent BlockingCollection 有内存泄漏吗?

Java 错误 : "Comparison method violates its general contract!"

java - 同步块(synchronized block)抛出 DuplicateKeyException

java - ConcurrentLinkedDeque的正确使用

java - 为什么不能在 Java 中将类型为 <ParentInterface> 的对象存储在类型为 <ChildInterface> 的容器中?

Java - Jboss 中的 javax.faces.el.E​​valuationException : java. lang.LinkageError

javascript - llnode 不返回 findjsobjects