gpt4 book ai didi

java - 内存不足何时发生?

转载 作者:行者123 更新时间:2023-11-29 06:31:00 25 4
gpt4 key购买 nike

最近,在运行我们的应用程序时,遇到了内存不足的异常。

这是异常发生前的堆转储

Heap
def new generation total 1572864K, used 366283K [0x00000006b0000000, 0x000000071aaa0000, 0x000000071aaa0000)
eden space 1398144K, 13% used [0x00000006b0000000, 0x00000006bbb12d40, 0x0000000705560000)
from space 174720K, 100% used [0x0000000710000000, 0x000000071aaa0000, 0x000000071aaa0000)
to space 174720K, 0% used [0x0000000705560000, 0x0000000705560000, 0x0000000710000000)

tenured generation total 3495296K, used 2658714K [0x000000071aaa0000, 0x00000007f0000000, 0x00000007f0000000)
the space 3495296K, 76% used [0x000000071aaa0000, 0x00000007bcf06ba8, 0x00000007bcf06c00, 0x00000007f0000000)

compacting perm gen total 42048K, used 41778K [0x00000007f0000000, 0x00000007f2910000, 0x0000000800000000)
the space 42048K, 99% used [0x00000007f0000000, 0x00000007f28ccb80, 0x00000007f28ccc00, 0x00000007f2910000)

No shared spaces configured.

看起来老一代快满了 (76%)。我假设当它最终达到 100% OOM 时发生。不过,eden 好像只有 13%。

谁能解释为什么即使在年轻代中还有一些空间也会发生 OOM?

最佳答案

JVM 可能抛出 OutOfMemoryError 的原因有很多,包括

  • Java 堆空间:当尝试分配一个对象或数组大于任一堆生成中的最大连续空闲 block 时;
  • GC overhead limit exceeded:当 JVM 花在垃圾收集上的时间比例变得太高时(参见 GCTimeLimitGCHeapFreeLimit);
  • PermGen space(Java 8 之前)或Metaspace(Java 8 以来):当类元数据的数量超过MaxPermSize最大元空间大小;
  • 请求的数组大小超过 VM 限制:尝试分配长度大于 Integer.MAX_VALUE - 2 的数组时;
  • Unable to create new native thread:当达到用户进程的 OS 限制时(参见 ulimit -u)或当没有足够的虚拟内存来为线程栈;
  • 直接缓冲区内存:当所有直接字节缓冲区的大小超过MaxDirectMemorySize或没有可用的虚拟内存来满足直接缓冲区分配时;
  • 当 JVM 无法为其内部结构分配内存时,可能是因为用完了可用的虚拟内存,也可能是因为达到了某些操作系统限制(例如内存映射区域的最大数量);
  • 当 JNI 代码无法分配一些 native 资源时;
  • 等等更不用说应用程序可以随时抛出 OutOfMemoryError 本身,只是因为开发人员决定这样做。

要找出特定错误的原因,您至少应该查看错误消息、堆栈跟踪和 GC 日志。

关于java - 内存不足何时发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33924624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com