В OP ваша программа прерывается, пока расширяется StringBuffer
. Вы должны предварительно распределить это до необходимого вам размера или, по крайней мере, близко к нему. Когда StringBuffer
должен расширять, ему требуется оперативная память для первоначальной емкости и новой емкости. Как сказал TomTom, ваш файл скорее всего будет 8-битным символом, поэтому он будет преобразован в 16-разрядный Unicode в памяти, поэтому он будет вдвое больше.
Программа еще не сталкивалась еще следующее удвоения - то есть в Java 6 StringBuffer.toString()
выделят новый String
и внутренний char[]
будет скопирован снова (в некоторых более ранних версиях Java это было не так). Во время этой копии вам потребуется вдвое больше места для кучи - поэтому в этот момент, по крайней мере, в 4 раза больше, чем ваш фактический размер файлов (30 МБ * 2 для байта-> Юникод, затем 60 МБ * 2 для вызова toString() = 120 МБ) , Как только этот метод будет закончен, GC очистит временные классы.
Если вы не можете увеличить кучу пространства для своей программы, у вас возникнут трудности. Вы не можете взять «легкий» маршрут и просто вернуть String
. Вы можете попытаться сделать это постепенно, так что вам не нужно беспокоиться о размере файла (одно из лучших решений).
Посмотрите на код своего веб-сервиса в клиенте. Он может предоставить способ использования другого класса, отличного от String
- возможно, java.io.Reader
, java.lang.CharSequence
или специального интерфейса, например, связанного с SAX org.xml.sax.InputSource
. Каждый из них может быть использован для создания класса реализации, который читает из вашего файла в кусках, поскольку вызывающие пользователи нуждаются в нем вместо того, чтобы сразу загрузить весь файл.
Например, если маршруты обработки веб-сервисов могут принимать CharSequence
, тогда (если они написаны хорошо), вы можете создать специальный обработчик для возврата только одного символа за раз из файла, но буфера ввода. См. Аналогичный вопрос: How to deal with big strings and limited memory.
Каков размер файла? Каковы ваши настройки памяти JVM -Xms, -Xmx? Любые настройки -XX? – shoover
Его около 30 МБ. Это может быть нечто большее. В принципе, то, что я написал, является клиентом, который потребляет веб-сервис. Клиент передает строку в качестве аргумента в веб-службу. В настоящее время я не изменил настройки JVM. – Deepak