【发布时间】:2012-01-19 05:28:48
【问题描述】:
这是一个关于 java 中垃圾收集的问题:如果分配了一大块内存(使用 new int[BIG_NUMBER] 或然而),是否有任何保证垃圾收集器会在抛出 OutOfMemoryError 之前收集垃圾?这是行为吗 垃圾收集器现在是 Java 规范的一部分吗?
我了解到垃圾收集器本身可能会抛出这样的异常,以防收集垃圾需要很长时间,至少在 Sun Hotspot Java 虚拟机的情况下
«如果在垃圾收集上花费的时间过多,并行/并发收集器将抛出 OutOfMemoryError:如果超过 98% 的总时间花在垃圾收集上,而回收的堆少于 2%,则OutOfMemoryError 将被抛出。此功能旨在防止应用程序长时间运行,而由于堆太小而几乎没有进展。如有必要,可以通过在命令行中添加选项 -XX:-UseGCOverheadLimit 来禁用此功能。 »
但是根据引用,这可以通过在命令中添加一个选项来禁用 行。
【问题讨论】:
-
“是否有任何保证垃圾收集器会在抛出 OutOfMemoryError 之前收集垃圾?” 如果存在对内存块的引用,则当然不能。跨度>
-
我没有很好地表达我的问题:问题是JVM在尝试分配大块内存时会做什么,并且看到剩余的堆空间不足:首先尝试垃圾收集,看到垃圾收集后剩余的内存仍然不足,然后引发 OutOfMemoryError,否则,依靠垃圾收集器线程足够频繁地完成其工作,立即引发 OutOfMemoryError 而不尝试先进行垃圾收集。下面的 Peter Lawrey 似乎回答了这个问题。
标签: java garbage-collection operating-system