2013-09-10 4 views
-3

Мое приложение для веб-приложений Ошибка OutOfMemory при передаче вокруг base64 Строка на стороне клиента, которую ему удается получить из образа буфера обмена.OutOfMemoryError при прохождении больших строк

Поблем случается, когда большая строка передается как аргумент другому методу.

Что такое работа вокруг при обходе большой base64 строку с GWT

+1

Что такое "большой"? – OldProgrammer

+1

Возможно, вы просто не в памяти. Сколько памяти вы дали вашей JVM, управляющей вашим веб-сервером (и какой сервер вы используете)? Или, может быть, у вас есть ошибка где-то. – nos

+0

Попробуйте разобрать с помощью [Base64InputStream] (http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64InputStream.html). – aim

ответ

1

Проблема происходит, когда большая строка передается в качестве аргумента другой метод.

Нет, это не так!

Передача строки в качестве аргумента не будет вызвать OutOfMemoryError.

OOME, который вы видите, вызван созданием объекта String или что-то делает с объектом String, создающим новые объекты. Это не вызвано передачей строки, независимо от того, насколько она велика.


Если вам нужны предложения о том, как справиться с этим, вам нужно будет показать нам код, который создает строку, и код, который использует его. Но общий подход к работе с чрезмерно большими кусками данных - это обработка данных таким образом, чтобы избежать одновременного представления всего этого в памяти.

+0

-1 Строка подключена к Java, ее больше, чем примитив, ее меньше, чем объект.Его параметризация похожа на «значение» (которое требует дополнительной памяти), но его инициализируется как «ссылка» (которая не требует дополнительной памяти). –

+0

@PeterRader. Либо ваше понимание проблемы неверно, либо вы неправильно прочитали мой ответ. Когда вы передаете объект String в качестве аргумента, вы фактически передаете ссылку 4 или 8 байтов. И эта ссылка передается в стек. Передача объекта ** любого типа ** в качестве аргумента не вызывает выделения кучи и, следовательно, НЕ МОЖЕТ привести к OOME. –

+0

Я могу воспроизвести OOME, используя большую строку в качестве параметра. Рекурсия в моем случае следует за MUTCH меньше циклов с большой строкой! Serioulsy, я больше ничего не делаю с параметром. jdk1.7.0_10. –

0

Это может быть вопрос GWT Jetty плагин для Eclipse, если вы используете режим GWT Development, попробуйте отключить режим устр, используя:

http://127.0.0.1:8888/index.html 

вместо

http://127.0.0.1:8888/index.html?gwt.codesvr=127.0.0.1:9997 

Если он работает, вы можете продолжать использовать режим dev, если вы увеличиваете пространство кучи JVM, например:

-XX:PermSize=128m -XX:MaxPermSize=256m -Xmx1224m 

Это должно быть вопрос разработчика. потому что передача строки может привести к ошибке OutOfMemory.

+0

Даже если размер строки составляет ~ 360 КБ? – xybrek

+0

Попробуйте, однако, вы должны попытаться найти другой способ справиться с этими данными, потому что он слишком велик, чтобы хранить в памяти с точки зрения производительности. –

+0

Да, это именно моя проблема, как иметь дело с изображением base64 из буфера обмена. – xybrek

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