2014-09-04 3 views
-1

У меня есть более 20 категорий, в которых каждая категория содержит более 400+ подкатегорий в веб-приложении.Я столкнулся с java.lang.OutOfMemoryError в web-приложении для больших данных

Когда я нажимаю на кнопку категории, она бросает java.lang.OutOfMemoryError. Вот код java-файла. В этом коде я помещаю данные подкатегории в объект json, а затем добавляю его в json-массив.

String responceObjectStr; 
JSONObject responseObject; 
for(int i=0;i<category.length;i++){ 
    responseObject = new JSONObject(); 
    JSONArray ja = new JSONArray(); 
    responseObject.put(category[i],Categorywisedata);//adding data to response 
    ja.put(responseObject);//putting response object to JSONArray 
    responceObjectStr = new String(ja.toString().getBytes("UTF-8")); 
    out.print(responceObjectStr);//response 
    responceObjectStr = null; 
    responseObject = null; 
} 

Здесь в каждой категории он может иметь 400+ подкатегорий. Когда я нажимаю кнопку категории, она показывает java.lang.OutOfMemoryError.

Как это решить. Я не хочу увеличивать JVM-память для этого. Я хочу, чтобы решение Java-кода обрабатывало это.

+2

Вы помещаете ту же Категорию для каждой категории в объект response. Насколько велика категория? Сколько памяти выделено вашей JVM? Вы пытались его увеличить? – Joram

+1

@Joram - вопрос говорит ** Я не хочу увеличивать память JVM для этого. ** – DavidPostill

+0

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

ответ

1

Что такое out в этом коде?
Это веб-приложение, и вы публикуете это через http?
Возможно, вы сможете очистить выходной поток. Если контейнер поддерживает потоковое содержимое, то он не будет накапливаться в потенциальном буфере, вызывая ошибку из памяти.

Какая строка вызывает исключение из памяти?

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

+0

здесь «PrintWriter out = response.getWriter();» объект PrintWriter. Да, это веб-приложение. И вы показываете альтернативный путь, на самом деле я делаю это. Но этого не происходит. –

+0

Спасибо за дополнительные сведения. Из javadoc ", если включена автоматическая промывка, это будет сделано только тогда, когда вызывается один из методов println, printf или format, а не всякий раз, когда выводится символ новой строки" - Пробовали ли вы промыть выходной поток? – pimaster

+0

Нет, я еще не пробовал. –