之前这是关于在Java垃圾收集的问题:如果一个分配的存储器大块(使用新INT [BIG_NUMBER]或不过),是否有任何保证一个垃圾收集器将一个前收集垃圾OutOfMemoryError被抛出?垃圾收集器的行为 现在是Java规范的一部分吗?垃圾收集的OutOfMemoryError
我已经了解到,垃圾收集器本身也可能会引发这种异常的情况下,时间过久,收集垃圾,至少在太阳热点Java虚拟机
的情况下«并行/并发收集器将抛出如果在垃圾收集中花费了太多时间,则会出现OutOfMemoryError:如果超过总时间的98%用于垃圾回收,并且只有不到2%的堆被恢复,则会抛出OutOfMemoryError。此功能旨在防止应用程序长时间运行,而由于堆太小,因此很少或没有进度。如有必要,可以通过在命令行中添加-XX:-UseGCOverheadLimit选项来禁用此功能。 »
但是这可以被禁用,根据引用,通过添加一个选项,所述命令行 。
*“有没有保证垃圾收集器会收集垃圾一个OutOfMemoryError抛出过吗?” *当然不是如果有内存块的参考。 –
我没有很好地解释我的问题:问题是JVM在尝试分配大块内存时发生了什么,并且看到剩余的堆空间不足:尝试首先进行垃圾收集,发现垃圾回收后收集仍然不足,然后引发OutOfMemoryError,否则,依靠垃圾收集器线程经常处理它的工作,立即引发OutOfMemoryError,而不是先尝试垃圾收集。下面的Peter Lawrey似乎回答了这个问题。 –