2015-03-19 2 views
-4

Я получаю:Почему я получаю java.lang.OutOfMemoryError?

java.lang.OutOfMemoryError : Java heap space 
Caused by: java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Arrays.java:2894) 
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:117) 
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:407) 
    at java.lang.StringBuilder.append(StringBuilder.java:136) 
+0

Предположительно, потому что вы используете больше памяти, чем у вас есть. С такой небольшой информацией, это все, что мы можем вам сказать. Пожалуйста, прочитайте http://tinyurl.com/stack-hints –

+1

Массив, который вы пытаетесь скопировать, слишком велик для настроенного размера кучи. Вы можете попробовать запустить свою Java-программу, используя 'java -Xmx512m -jar '. Это сделает размер кучи 512 МБ. – Petter

+0

Покажите свой код, особенно ту часть, где вы добавляете 'StringBuilder' (или конкатенацию к String). – Kayaman

ответ

1

ltimately всегда имеет конечный максимум кучи не использовать независимо от того, на какую платформу вы работаете на. В Windows 32 бит это около 2 ГБ (не в кучу, а общий объем памяти на процесс). Просто случается, что Java делает меньше по умолчанию (предположительно так, что программист не может создавать программы, у которых есть выделение памяти беглеца, не сталкиваясь с этой проблемой, и нужно точно изучить, что они делают).

Таким образом, это дает вам несколько подходов, которые вы могли бы решить, чтобы определить, какой объем памяти вам нужен или уменьшить объем используемой памяти. Одна распространенная ошибка с сборками мусора, такими как Java или C#, заключается в том, чтобы поддерживать ссылки на объекты, которые вы больше не используете, или выделять многие объекты, когда вы можете их повторно использовать. Пока объекты ссылаются на них, они будут продолжать использовать кучу пространства, поскольку сборщик мусора не будет удалять их.

В этом случае вы можете использовать профилировщик памяти Java, чтобы определить, какие методы в вашей программе распределяют большое количество объектов, а затем определить, есть ли способ убедиться, что они больше не ссылаются или не выделять их в первое место. Одним из вариантов, который я использовал в прошлом, является «JMP» http://www.khelekore.org/jmp/.

Если вы определяете, что вы распределяете эти объекты по какой-либо причине, и вам необходимо поддерживать ссылки (в зависимости от того, что вы делаете, это может быть так), вам просто нужно увеличить максимальный размер кучи при запуске программа. Однако, как только вы выполняете профилирование памяти и понимаете, как ваши объекты распределяются, вы должны иметь лучшее представление о том, сколько памяти вам нужно.

В общем случае, если вы не можете гарантировать, что ваша программа будет работать в некотором конечном объеме памяти (возможно, в зависимости от размера ввода), вы всегда столкнетесь с этой проблемой. Только после исчерпания всего этого вам нужно будет искать объекты кэширования на диске и т. Д. На этом этапе у вас должна быть очень веская причина сказать «Мне нужно Xgb памяти» для чего-то, и вы не можете обойти его, улучшив ваши алгоритмы или шаблоны распределения памяти. Обычно это обычно будет иметь место для алгоритмов, работающих на больших наборах данных (например, в базе данных или в какой-либо программе научного анализа), а затем становятся полезными такие методы, как кэширование и отображение IO с памятью.

+3

Когда вы копируете чей-то ответ, имейте любезность, чтобы дать кредит http://stackoverflow.com/questions/37335/how-to-deal-with-java-lang-outofmemoryerror-java-heap-space-error-64mb -heap –

1

OutOfMemoryError обычно вызван тем, что VM не имеет достаточного количества памяти для запуска вашего проекта. Вы запускали его непосредственно из командной строки или используете среду IDE?

Например, попробуйте запустить вашу программу с добавлением опции -Xmx1G, которая выделяет 1Go кучи памяти в вашу программу, вы можете, конечно, настроить ее для вашего удобства. G для Go, а m - для Mb.

1

Вы должны дать куче больший размер, чтобы он работал.

Смежные вопросы