Garbage collection before OutOfMemoryError
这是一个关于java中垃圾收集的问题:如果一个人分配了一大块内存(使用new int [BIG_NUMBER]或者),是否有任何保证垃圾收集器会在抛出OutOfMemoryError之前收集垃圾?这是这种行为吗?
垃圾收集器现在是Java规范的一部分吗?
我已经知道垃圾收集器本身可能会抛出这样的异常以防收集垃圾花费太长时间,至少在Sun Hotspot Java虚拟机的情况下
?如果在垃圾收集中花费了太多时间,则并行/并发收集器将抛出OutOfMemoryError:如果超过98%的总时间花费在垃圾收集中,并且回收的堆少于2%,则OutOfMemoryError将是抛出。此功能旨在防止应用程序长时间运行,同时由于堆太小而很少或没有进度。如有必要,可以通过在命令行中添加选项-XX:-UseGCOverheadLimit来禁用此功能。 ?
但根据引用,可以通过在命令中添加选项来禁用此功能
线。
AFAIK,它一直是Spec的一部分。
如果VM内存非常低,早期的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
Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector.
这很简单,没有。
您的程序可能会致电Runtime.gc()寻求帮助。