Мы смогли правильно определить глобальный пул соединений.

пользуем Retrofit / OkHttp3 для всего сетевого трафика из нашего приложения для Android. Пока что все идет довольно гладко.

Тем не менее, у нас теперь время от времени заканчивались дескрипторы файлов в нашем приложении / процессе.

Android позволяет использовать до 1024 файловых дескрипторов на процессOkHttp создаст новый поток для каждого асинхронного вызоваКаждый поток, созданный таким образом, будет (по нашему наблюдению) отвечать за 3 новых дескриптора файла (2 канала и один сокет).

Мы смогли отладить это точно, где каждый отправленный асинхронный вызов, используя.enqueue() приведет к увеличению количества открытых файловых дескрипторов на 3.

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

Это означает, что если вы быстро отправляете запрос,пул подключений будет увеличиваться в размереи так будетколичество файловых дескрипторов - пока вы не достигнете 1024, где приложение падает.

Я видел, что можно ограничить количество параллельных вызовов сDispatcher.setMaxRequests()(хотя кажется неясным, действительно ли это работает, см.Вот) - но это все еще не решает проблему с накоплением открытых потоков и файловых дескрипторов.

Как мы можем помешать OkHttp создавать слишком много файловых дескрипторов?

Ответы на вопрос(1)

Ваш ответ на вопрос