Я запускаю некоторый код Java с -Xmx1024m, и в какой-то момент я получаю hprof из-за OOM.Hprof показывает только 320 МБ и дает мне трассировку стека:
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)
...
Это происходит из большой строки, которую я копирую.
Я помню, что где-то читал (не могу найти), что произошлоэти случаи таковы:
- процесс по-прежнему не использует 1 ГБ памяти, он намного ниже
- , даже если объем кучи все еще ниже 1 ГБ, ему требуется некоторое количество памяти, а для
copyOfRange()
это должна быть непрерывная память, поэтому, даже если она еще не превышает лимит, она не может найти достаточно большой фрагмент памяти на хосте, она завершается с OOM.
Я пыталсяпоищите документацию по этому вопросу (copyOfRange()
нужен блок непрерывной памяти), но не удалось найти какой-либо.
Другому возможному виновнику не хватило бы постоянной памяти.
Может ли кто-нибудь подтвердить или опровергнуть гипотезу непрерывной памяти?Любой указатель на какой-то документ тоже поможет.