java.lang.OutOfMemoryError:Java堆空间的含义 该消息表示应用程序仅需要比其正常运行所需的Java堆空间更多的空间。
java.lang.OutOfMemoryError:超出GC开销限制的意思是 此消息表示由于某种原因,垃圾收集器占用过多的时间(默认情况下为该进程所有CPU时间的98%),并且每次运行都恢复很少的内存(默认情况下为堆的2%)。在内部,这还意味着当应用程序仅需要比其正常运行可用的Java堆空间更多的空间时。
所以我的问题是以上两种情况中的哪一种会被触发?
所以这是我的理解,何时会根据情况抛出特定的异常:
假设我分配了1GB的堆大小。当前正在使用的堆内存为970 MB。一个线程启动了(JVM不预先知道它将消耗多少内存)。现在,GC可以采取以下步骤之一
1)JVM开始分配内存,然后在某一时间耗尽1GB的内存并抛出 java.lang.OutOfMemoryError: Java heap space
2)GC会提前运行,并尝试释放一些内存,因为它知道当前正在使用的内存已接近1 GB分配的堆。但是在随后的每次运行中,它不能释放超过2%的空间。然后它会抛出java.lang.OutOfMemoryError: GC overhead limit exceeded
在我的问题中我的理解正确吗?