我用 -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的内存,远低于
- 即使堆仍然低于 1gb,它也需要一些内存,并且
copyOfRange()
它必须是连续内存,所以即使它还没有超过限制,它也无法在主机上找到足够大的内存,它会失败一个OOM。
我试图寻找这方面的文档(copyOfRange()
需要一块连续的内存),但找不到任何东西。
另一个可能的罪魁祸首是 permgen 内存不足。
有人可以证实或反驳连续记忆假设吗?任何指向某个文档的指针也会有所帮助。