Глядя на трассировку стека, похоже, что реализация Android HttpClient.execute () выдает OOM.
Это не указано в трассировке стека, имеющейся у вас в проблеме. Конечно, вы не предоставили всю трассировку стека по этой проблеме.
Какой лучший способ привлечь внимание разработчиков Android по этому поводу? Любые лучшие варианты, чем отчетность по http://code.google.com/p/android/issues?
Вероятность того, что эта ошибка будет чистой для Android, невелика, но не равна нулю.
Вот некоторые другие возможности в произвольном порядке:
Нет проблем с execute()
как таковыми, но у вас просто не хватает памяти, и следы стека, с которыми вы столкнулись, просто демонстрируют, что execute()
нагружает вашу кучу.
Проблема заключается в некоторых модификациях, которые HTC внесла в Android для Thunderbolt, возможно, вступают в силу только в сети LTE.
Эта проблема каким-то образом вызвана самой сетью Verizon LTE (например, некоторые их прокси отправляют обратно информацию о бейсболе, из-за которой у HttpClient есть затухание).
Любые идеи о том, как я могу обойти это?
Во-первых, я бы использовал существующие инструменты (например, выгрузку HPROF и проверку с помощью Eclipse MAT), чтобы убедиться, что у вас нет утечки памяти в целом, что комбинация Thunderbolt / LTE, похоже, просто срабатывает.
Далее я рекомендую вам найти способ последовательно воспроизвести ошибку. Это может быть ваше существующее приложение с серией шагов, которым нужно следовать, или это может быть выделенное приложение (например, зарегистрируйте URL-адрес, который вызывает OOM, а затем создайте крошечное приложение, которое просто выполняет этот запрос HttpClient). Хотелось бы, чтобы у DeviceAnywhere был Thunderbolt, но это не похоже. Я выведу несколько пробников и посмотрю, смогу ли я получить помощь на этом фронте.
С точки зрения обхода этой проблемы, в качестве временного промежутка, вы можете обнаружить, что вы работаете на Thunderbolt через данные android.os.Build
, и, возможно, что вы используете LTE через ConnectivityManager
(я предполагаю, что LTE будет перечислите как WiMAX, но это только предположение) и предупредите пользователей о проблемах с этим комбо.
Помимо этого, вы можете попробовать немного изменить использование HttpClient и посмотреть, имеет ли он эффект, например:
- Если вы поддерживаете только API уровня 8 или выше, вы можете дать
AndroidHttpClient
выстрел в качестве замены вместо
- Отключить многопоточный доступ (в целом или для Thunderbolt) и избавиться от
ThreadSafeClientConnManager
Извините, что у меня нет ответа "волшебная пуля" для вас здесь.
UPDATE
Теперь, когда у меня есть полная трассировка стека, просмотр исходного кода ... немного освещает.
Проблема заключается в том, что:
HttpConnectionParams.getSocketBufferSize(params);
возвращает значение 2 МБ, которое вызывает OOM. Это очень большой буфер, особенно для движка Dalvik GC, который может быть фрагментирован (да, это слово снова).
params
вот это HttpParams
. Вы, кажется, создаете их сами с помощью getHttpParams()
. Например, AndroidHttpClient
устанавливает значение 8192:
HttpConnectionParams.setSocketBufferSize(params, 8192);
Если вы сами устанавливаете размер буфера сокета, попробуйте уменьшить его. Если нет, попробуйте установить его на 8192 и посмотреть, поможет ли это.