2011-12-13 87 views
2

之前这是关于在Java垃圾收集的问题:如果一个分配的存储器大块(使用新INT [BIG_NUMBER]或不过),是否有任何保证一个垃圾收集器将一个前收集垃圾OutOfMemoryError被抛出?垃圾收集器的行为 现在是Java规范的一部分吗?垃圾收集的OutOfMemoryError

我已经了解到,垃圾收集器本身也可能会引发这种异常的情况下,时间过久,收集垃圾,至少在太阳热点Java虚拟机

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

但是这可以被禁用,根据引用,通过添加一个选项,所述命令行 。

+0

*“有没有保证垃圾收集器会收集垃圾一个OutOfMemoryError抛出过吗?” *当然不是如果有内存块的参考。 –

+1

我没有很好地解释我的问题:问题是JVM在尝试分配大块内存时发生了什么,并且看到剩余的堆空间不足:尝试首先进行垃圾收集,发现垃圾回收后收集仍然不足,然后引发OutOfMemoryError,否则,依靠垃圾收集器线程经常处理它的工作,立即引发OutOfMemoryError,而不是先尝试垃圾收集。下面的Peter Lawrey似乎回答了这个问题。 –

回答

3

据我所知,这一直是规范的一部分。

如果虚拟机是内存很低早期的OutOfMemoryError是一个Java 6的功能,并引入停止虚拟机时,它变得不可用,但没有完全死了。

我不会关闭该功能,你好得多工程系统,所以你永远不会接近98%,内存使用情况。我建议30%是一个更舒适的水平运行。

从Javadoc文档的Java 1.4.2(2002年推出)的时候,因为它是内存不足Java虚拟机无法分配一个对象,可以通过以下方式提供没有更多的内存http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/OutOfMemoryError.html

扔了,垃圾收集器。

-2

它是简单的,没有。 您的程序可能会调用Runtime.gc()来获得帮助。

+0

不,它将在OutOfMemoryError之前运行,并且gc()不会强制GC运行。 –

+0

System.gc()只是一个建议而已,实际上我知道的所有vm实现在调用System.gc()时都会执行gc。干扰者们在非工作时间做了明确的gc,以便在后果很小的情况下强制完成gc。 – Erik