java.lang.OutOfMemoryError相对于java堆空间超出了GC开销限制?
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堆空间超出了GC开销限制?,java,garbage-collection,heap,Java,Garbage Collection,Heap,java.lang.OutOfMemoryError的含义:java堆空间的含义 该消息意味着当应用程序只需要比正常运行所需的更多Java堆空间时 java.lang.OutOfMemoryError的内容:超出GC开销限制意味着 此消息意味着由于某种原因,垃圾收集器占用了过多的时间(默认情况下占进程所有CPU时间的98%),并且在每次运行中恢复的内存很少(默认情况下占堆的2%)。这在内部也意味着,当应用程序只需要比正常运行所需的更多Java堆空间时 所以我的问题是,在上述两种情况中,哪种情况会
java.lang.OutOfMemoryError:java堆空间
2) GC提前运行并尝试释放一些内存,因为它知道当前正在使用的内存接近1GB分配的堆。但它不能在每个空间中释放超过2%的空间
后续运行。然后它将抛出java.lang.OutOfMemoryError:超出GC开销限制
就我的问题而言,我的理解正确吗
OutOfMemoryError:Java堆空间
JVM没有办法满足分配请求,即使是在执行了所有最后的努力之后
超出了OutOfMemoryError GC开销限制
这意味着JVM可能能够满足分配请求,但在最近的过去,它必须频繁地进行GC,以至于用于GCing的CPU时间超过了java进程使用的总CPU时间的一小部分(可配置的)
JVM会自行终止,而不是停留在半工作、高度低效的状态,随着时间的推移,这种状态可能只会变得更糟
通常,禁用GC开销OOM只会在几分钟后导致Java堆空间OOM
它基本上是一种快速失效的机制
java.lang.OutOfMemoryError: Java heap space
原因:无法在Java堆中分配对象。此错误不一定意味着内存泄漏。问题可以像配置问题一样简单,其中指定的堆大小(或默认大小,如果未指定)不足以满足应用程序的需要
java.lang.OutOfMemoryError: GC Overhead limit exceeded
正如您所引用的,垃圾收集花费的时间过长。这可能是应用程序内存泄漏的副作用。由于泄漏,旧gen可能已满,因此GC在垃圾收集周期中不会释放任何(或很少)垃圾
请查看此oracle以排除不同类型的内存泄漏
关于你的两个问题,我也认为你的理解是正确的,只是有所不同。在第二种情况下触发GC的事件不仅仅是创建新对象。完全GC将在特定条件下触发。看看这个问题 是的。你的理解是绝对正确的。JVM不会在OOM上“自行终止”。只有当OOM导致最后一个非守护进程线程终止时,JVM才会终止(通常的退出机制仍然适用),我使用了
-XX:onAutofmemoryError='kill-9%p'
来达到这个效果,因为抛出像OOM这样的任何异常都会使进程处于未定义状态,人为地减少JBoss服务器堆内存并部署应用程序会抛出“超出GC开销限制”。操作中没有泄漏,只是内存不足。