有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

找不到足够的连续内存会导致OOM吗?

我从-Xmx1024m开始编写一些java代码,在某个时候,由于OOM,我得到了一个hprof。hprof仅显示320mb,并提供堆栈跟踪:

 at java.util.Arrays.copyOfRange([CII)[C (Arrays.java:3209)
  at java.lang.String.<init>([CII)V (String.java:215)
  at java.lang.StringBuilder.toString()Ljava/lang/String; (StringBuilder.java:430)
  ...

这来自我正在复制的一个大字符串

我记得在某个地方读到(找不到)发生的情况是这些案例是:

  • 进程还没有消耗1gb内存,远远低于
  • 即使heap仍然低于1gb,它也需要一些内存,对于copyOfRange(),它必须是连续内存,因此即使它还没有超过限制,它也无法在主机上找到足够大的内存,它会出现OOM故障

我试图在上面查找doc(copyOfRange()需要一块连续内存),但找不到任何

另一个可能的罪魁祸首是permgen内存不足

有人能证实或反驳持续记忆假说吗?任何指向某个文档的指针也会有所帮助


共 (1) 个答案

  1. # 1 楼答案

    如果您使用的是并发标记扫描收集器,则可以获得碎片。然而,对于新的物体,只要有足够的年轻一代空间,你就不需要担心碎片,因为自由的伊甸园空间总是连续的

    在许多应用程序中,只有一小部分堆是留给年轻一代的,因此如果你有一个碎片化的终身空间,并且你创建了一个相对较小的对象(小到最大内存大小的5%),你可能会得到一个OutOfMemory错误

    如果运行接近最大内存,性能会非常差,我建议您要么减少应用程序使用的内存,要么增加最大内存。这也增加了你们这一代人的规模。或者,您可以设置-XX:NewSize=512m