2015-08-09 3 views
0

Мой код Java часто застрял в петле «в то время как ((строка = rd.readLine())! = NULL) {»Мой код Java часто застревает в цикле "while ((line = rd.readLine())! = Null) {". Как оптимизировать код

Я думаю, это потому, что сбор мусора Java не получить обратно часть Память. Переменная «line» будет указывать на новый контент на каждой итерации, и память о старом содержимом «строки» по какой-то причине не будет возвращена java GC.

Итак, как оптимизировать код, чтобы устранить проблему?

Код выглядит следующим образом:

for (String url : urlList) { // a loop that process ~1000 urls 
     HttpResponse response = fetchSomeUrl(url); 
     // I already confirmed that response code is 200 OK, which means HttpResponse is generated successfully. 

     BufferedReader rd = new BufferedReader (new InputStreamReader(response.getEntity().getContent())); 
     StringBuilder raw_content = new StringBuilder(); 
     String line; 
     int i = 0; 
     System.out.println("=====start processing rd.readLine()"); 
     while ((line = rd.readLine()) != null) { 
     // my code often stuck here when there are more than 1000 lines in rd 
     System.out.println("=====processing " + i + "th line"); 
     raw_content.append(line); 
     raw_content.append("\n"); 
     i++; 
     } 
     System.out.println("=====finished processing rd.readLine()"); 
    } 
+2

Это не имеет никакого отношения к GC; вы, вероятно, застряли в ожидании сети. – SLaks

+0

Как вы знаете, что это застряло, а не просто потратить много времени на цикл, основанный на I/O, внутри внешнего цикла итерации 1000? –

+0

Я знаю, что это stucks во внутреннем цикле, потому что я добавил несколько «System.out.println()» в коде. Я вижу, что он утихает там после печати «===== обработка 815 итераций» – user3462510

ответ

2

Мой код Java часто застрял в петле "в то время как ((строка = rd.readLine())! = NULL) {"

Слово 'заблокировано'. Он заблокирован, ожидая появления другой строки от сверстника или для сверстника, чтобы закрыть соединение.

Я думаю, это потому, что сбор мусора java не получил некоторую память.

Это не имеет никакого отношения к сбору мусора, Java или памяти. Это связано с тем, что сверстник или не делает.

Переменная «линия» укажет на новое содержимое на каждой итерации, и память старого содержимого «линии» по какой-то причине не будет возвращена java GC.

Это глупость, и даже если бы это было так, это не объясняло бы явления.

So Как оптимизировать код, чтобы исправить проблему?

Это не проблема кодирования, и если бы это было так, то никакая «оптимизация» не решила бы ее. Ваша программа работает как закодированная. Этот цикл будет повторяться до тех пор, пока одноранговый узел не отключится, и он будет блокироваться, пока не будет прочитана полная строка или конец потока.

Вы должны обрабатывать каждую строку по мере ее поступления, а не пытаться собрать их и обрабатывать их все, когда партнер отключается.

EDIT Вы можете рассмотреть возможность установки таймаута чтения для обнаружения проблемных случаев.

+0

Спасибо, я добавил еще несколько строк в код, чтобы сделать его более понятным. Фактически, каждая итерация во внешнем цикле обрабатывает другой URL-адрес.Как вы видите в коде, я уже создал httpResponse, прежде чем я запустил внутренний цикл, и BufferedReader просто считывает из этого httpResponse. Таким образом, BufferedReader больше не зависит от сетевого подключения. Таким образом, я не уверен, почему бывают случаи, когда нет полной строки или конца потока для чтения. – user3462510

+0

Конечно, это зависит от сетевого подключения. Вот откуда берется ответ HTTP. – EJP

+0

спасибо, @EJP. настройка тайм-аута уже установлена ​​в функции fetchSomeUrl(). Я не понимаю, что, поскольку я уже подтвердил, что httpResponse успешно сгенерирован, тогда в этой итерации не должно быть неопределенности в сети. – user3462510

-1

Ваш цикл не остановится, пока не достигнет нуля в качестве кода written.You следует добавить условие, которое указует программу, чтобы остановить, когда он достигнет 1000. И Кроме того, ваш контент может быть более 1000, чем вы ожидали, поэтому он застрял.

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

  • Нет связанных вопросов^_^