Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.OutOfMemoryError相对于java堆空间超出了GC开销限制?_Java_Garbage Collection_Heap - Fatal编程技术网

java.lang.OutOfMemoryError相对于java堆空间超出了GC开销限制?

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堆空间的含义 该消息意味着当应用程序只需要比正常运行所需的更多Java堆空间时

java.lang.OutOfMemoryError的内容:超出GC开销限制意味着 此消息意味着由于某种原因,垃圾收集器占用了过多的时间(默认情况下占进程所有CPU时间的98%),并且在每次运行中恢复的内存很少(默认情况下占堆的2%)。这在内部也意味着,当应用程序只需要比正常运行所需的更多Java堆空间时

所以我的问题是,在上述两种情况中,哪种情况会被触发

因此,以下是我对基于场景引发特定异常的理解:-

假设我已经分配了1GB的堆大小。当前使用的堆内存为970 MB。线程已启动(JVM不知道它将消耗多少内存)。 现在,GC可以执行以下步骤之一

1) JVM开始分配内存,然后在某个时间点耗尽1GB内存并抛出
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开销限制”。操作中没有泄漏,只是内存不足。