如果Java有垃圾收集,那为什么会出现OutOfMemoryError?

Pra*_*kar 7 java garbage-collection out-of-memory

这是一个理论问题.我只是好奇,如果Java有一个垃圾收集机制来释放内存,那么为什么还会OutOfMemoryError发生呢?

我搜索了这个,但可以得到这些链接

垃圾收集器是否保证在Out of Memory Error之前运行?

OutOfMemoryError之前的垃圾收集

这些没有具体回答我的问题.如果Java通过使用垃圾收集很好地允许内存,那么为什么会OutOfMemoryError发生呢?

Cod*_*ice 12

如果内存中的所有对象都不符合垃圾回收的条件,则可能发生OutOfMemoryError.例如:

List<MyClass> hellos = new ArrayList<>();
for (;;) {
   hellos.add(new MyClass());
}
Run Code Online (Sandbox Code Playgroud)

这将创建一个列表并继续MyClass向其添加对象,直到内存耗尽.没有任何对象符合垃圾收集的条件,因为它们都引用了所有对象.

  • @PrasadKharkar - 你不需要一个无限循环.这只是一个简单的例子.您所需要的只是一个问题,即计算中的可达数据量对于堆来说太大......在计算过程中的某个时间. (4认同)
  • @PrasadKharkar - 你甚至不需要循环!只是尝试分配一个非常大的数组. (2认同)