Мой код 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()");
}
Это не имеет никакого отношения к GC; вы, вероятно, застряли в ожидании сети. – SLaks
Как вы знаете, что это застряло, а не просто потратить много времени на цикл, основанный на I/O, внутри внешнего цикла итерации 1000? –
Я знаю, что это stucks во внутреннем цикле, потому что я добавил несколько «System.out.println()» в коде. Я вижу, что он утихает там после печати «===== обработка 815 итераций» – user3462510