java - 避免 PermGen 内存不足和超出 GC 开销限制

标签 java garbage-collection classloader java-6 permgen

我正在尝试生成类并在运行时加载它们。
我正在使用 ClassLoader 对象来加载类。因为我不想耗尽 PermGen 内存,所以我不时地取消引用类加载器并创建一个新的类加载器来加载要使用的新类。这似乎工作正常,我没有得到 PermGen 内存不足。 问题是当我这样做时,过了一会儿我收到以下错误:

java.lang.OutOfMemoryError: GC overhead limit exceeded 

所以我的问题是,我什么时候应该取消引用类加载器以避免这两个错误?:
我应该在我的代码中监视 PermGen 的使用,以便我取消引用当 PermGen 使用接近极限时,类加载器和调用 System.gc()
或者我应该采用不同的方法?
谢谢

最佳答案

没有唯一的正确答案。

一方面,如果取消链接类加载器可以解决您的 permgen 泄漏问题,那么您应该继续这样做。

另一方面,“GC overhead limit exceeded”错误意味着您的应用程序在垃圾收集上花费了太多时间。在大多数情况下,这意味着您的堆太满了。但这可能意味着两件事之一:

  • 堆太小,无法满足您的应用程序要求。

  • 您的应用程序存在内存泄漏。

您可以假设问题出在前者,只需增加堆大小即可。但如果真正的问题是后一个,那么增加堆大小只是推迟不可避免的事情......正确要做的是找到修复内存泄漏问题。


不要调用 System.gc()。这不会有帮助。

关于java - 避免 PermGen 内存不足和超出 GC 开销限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19572775/

相关文章:

java - 概率数学总是输出零?

java - 如何将数据从一个数组列表传递到另一个数组列表

java - Android 上的自定义 View 和窗口属性

c++ - 自定义弱/强引用指针

java - 分代垃圾收集是如何工作的?

java - mvn Sonar :sonar running Error: cannot be cast to org. sonar.java.resolve.JavaSymbol$TypeJavaSymbol

java - 使用 JarInputStream 读取方法读取字节调用 defineClass 时出现 ClassFormatError

java - Netbeans 插件开发

c# - WPF 中的低分配绘图

scala 类加载器困惑