我正在尝试生成类并在运行时加载它们。
我正在使用 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/