OutOfMemoryError之前的垃圾收集

时间:2011-12-13 10:24:14

标签: java garbage-collection operating-system

这是一个关于java中垃圾收集的问题:如果一个人分配了一大块内存(使用新的int [BIG_NUMBER]或者),是否有任何保证垃圾收集器会在抛出OutOfMemoryError之前收集垃圾?这是这种行为吗? 垃圾收集器现在是Java规范的一部分吗?

我已经了解到垃圾收集器本身可能会抛出这样的异常,以防收集垃圾花费太长时间,至少在Sun Hotspot Java虚拟机的情况下

«如果在垃圾收集中花费了太多时间,则并行/并发收集器将抛出OutOfMemoryError:如果超过98%的总时间用于垃圾收集,并且回收的堆少于2%,则将抛出OutOfMemoryError。此功能旨在防止应用程序长时间运行,同时由于堆太小而很少或没有进度。如有必要,可以通过在命令行中添加选项-XX:-UseGCOverheadLimit来禁用此功能。 »

但根据引用,可以通过向命令添加选项来禁用此功能 线。

2 个答案:

答案 0 :(得分:3)

AFAIK,它一直是规范的一部分。

早期的OutOfMemoryError,如果内存非常低,则是Java 6的一项功能,它被引入以在VM变得无法使用但不完全死亡时停止它。

我不会关闭此功能,你最好不要设计你的系统,这样你就不会接近98%的内存使用率。我建议30%是一个更舒适的水平。

来自Javadoc for Java 1.4.2(2002年推出)http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/OutOfMemoryError.html

  

当Java虚拟机由于内存不足而无法分配对象时抛出,垃圾收集器不再提供更多内存。

答案 1 :(得分:-2)

这很简单,没有。 您的程序可能会致电Runtime.gc()寻求帮助。