утечка памяти / производительность с SSL, встроенным Java на Linux - PullRequest
0 голосов
/ 22 февраля 2019

Давайте посмотрим, смогу ли я правильно объяснить мою проблему: это встроенная версия oracle 1.8_201, которую я использую на встроенном Linux 2.6.30 с контроллером ARMv5, 64M RAM.

Программа взаимодействует ссервер через HttpURLConnections без проблем.Производительность хорошая, а потребление памяти на стороне Linux стабильно.Теперь, когда переключается на связь SSL, начинается проблема с памятью ... Я использую наиболее рекомендованную реализацию: наличие SSLContext, получение SSLSocketFactory (только один раз в статической переменной) в качестве конфигурации.Теперь URL.openConnection () возвращает мне HttpsURLConnection, для которого я устанавливаю SSLSocketFactory.
При чтении inputStream я читаю его до -1, а затем вызываю .disconnect () для соединения.
Это сделанокаждые 10 с.
То, что я сейчас наблюдаю на Wireshark, выглядит следующим образом: соединение запускается с обычными средствами TLS для установления связи и шифрования, и что данные передаются нормально в течение 0,8 с.Но затем, примерно через 5 с, моя сторона (клиент) отправляет encrypted_Alert, чтобы закрыть соединение, которое затем выполняется ... и через 4 с (оставшееся время до 10 с) соединение запускается, как указано выше, с полной нагрузкой на подтверждение связи TLS.и так далее ... Почему это так и как я могу избежать этого?
Проблема, возникающая при этой процедуре, заключается в том, что я сталкиваюсь с утечкой памяти, которая приводит к тому, что linux «убивает» процесс Java-процесса ... При получении дампа кучи Java я вижу множество открытых объектов Finalizer, которые, очевидно, потребляютmemory.
Затем я вызывал system.gc () каждый раз, когда выполняю connection.disconnect, что вызывает полный GC, который занимает около 1 с на каждый вызов.В этом случае память, кажется, поддерживает разумный уровень, и у меня нет финализаторов в куче - но тогда у меня есть этот тайм-аут GC (который является исключительным!) И определенно слишком длинный.Итак, что еще я сделал ...
Я сократил интервал между сеансами связи до 4 с, чтобы никогда не возникало тайм-аута для закрытия соединения ... И это тоже работает нормально - память не протекает, и у меня гораздо меньше открытыхФинализаторы.
Мне бы очень помогло, если бы я установил этот странный тайм-аут на 15 с, чтобы я мог использовать свой интервал 10 с, как требуется.Я пытался установить заголовки Http со всеми вариантами «keep-alive», но ничто не влияет на это «autoclose» ...
Есть идеи, как это исправить?

Хорошо, давайте разберем его на два вопроса:
- Почему объекты соединения SSL сохраняются так долго без завершения?
- Почему этот HttpsURLConnection закрывается через 5 с и как я могу увеличитьэтот раз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...