【发布时间】:2023-04-04 04:55:01
【问题描述】:
java.lang.OutOfMemoryError: Java heap space 是什么意思 该消息意味着当应用程序需要的 Java 堆空间多于其正常运行的可用空间时。
java.lang.OutOfMemoryError: GC overhead limit exceeded 是什么意思 此消息意味着由于某种原因,垃圾收集器占用了过多的时间(默认情况下是进程所有 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
就我的问题而言,我的理解是否正确?
【问题讨论】:
-
是的..你的理解绝对正确。
标签: java garbage-collection heap-memory