我用-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)
...
这来自我正在复制的大字符串。
我记得在某处找不到(找不到的地方)发生的事情是:
copyOfRange()
它必须是连续内存,所以即使它还没有超过限制,它也找不到足够大的内存在主机上的内存,它失败了OOM。我试图在此寻找文档(copyOfRange()
需要一块连续内存),但找不到任何内容。
另一个可能的罪魁祸首是permgen记忆不够。
有人可以确认或反驳持续记忆假设吗?任何指向某些文档的指针也会有所帮助。
答案 0 :(得分:1)
如果您使用并发标记清除收集器,则可能会出现碎片。但是对于新的物体,如果有足够的年轻代空间,你不需要担心碎片,因为自由的伊甸园空间总是连续的。
在许多应用程序中,只有一小部分堆被提供给年轻代,所以如果你有一个零碎的终身空间并且你创建了一个相对较小的对象(小到最大内存大小的5%),你可以得到OutOfMemoryError。
如果你接近最大内存,你会有非常差的性能,我建议你让应用程序使用更少的内存或增加最大值。这也增加了你的世代尺寸。或者,您可以设置-XX:NewSize=512m