避免超出PermGen内存和GC开销限制

pab*_*blo 5 java garbage-collection permgen classloader java-6

我正在尝试生成类并在运行时加载它们.
我正在使用一个ClassLoader对象来加载类.因为我不想耗尽PermGen内存,所以我不时引用类加载器并创建一个新的加载要使用的新类.这似乎工作正常,我不会PermGen失去记忆.问题是,当我这样做时,一段时间后我得到以下错误:

java.lang.OutOfMemoryError: GC overhead limit exceeded 
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*n C 6

对此没有一个正确的答案.

一方面,如果取消链接类加载器正在解决你的permgen泄漏问题,那么你应该继续这样做.

另一方面,"超出GC开销限制"错误意味着您的应用程序花费了太多时间进行垃圾回收.在大多数情况下,这意味着您的堆太满了.但这可能意味着两件事之一:

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

  • 您的应用程序有内存泄漏.

您可以假设问题是前者,只是增加堆大小.但如果真正的问题是后者,那么增加堆大小只是推迟不可避免的......并且正确的做法是找到修复内存泄漏.


不要打电话System.gc().它无济于事.