Как заставить Android собирать старую информацию о сокете? - PullRequest
2 голосов
/ 06 декабря 2010

У меня есть проект, в котором я разрабатываю приложение для Android с использованием большого количества существующего кода C ++, доступ к которому осуществляется через JNI, который открывает и закрывает сокеты.

Даже несмотря на то, что этот C ++ правильно обрабатывает закрытие открываемых сокетов, кажется, что ОС Android или JVM хранят ссылки на эти сокеты / порты, используемые до следующего вызова GC.

Что произойдет, если мы остановим приложение и запустим его снова перед следующим вызовом GC, приложение не сможет создавать подключения к тому же сокету / порту.Если мы подождем, пока ОС вызовет GC и , то перезапустит приложение, оно успешно создаст соединения.

Есть ли способ вручную освободить сокет с точки зрения Android / JVM?Возможно утилита класса сокета?Ручной вызов в GC?

Ответы [ 2 ]

5 голосов
/ 06 декабря 2010

Стек протокола TCP / IP операционной системы удерживает порты TCP в течение двух минут после того, как приложение их закрывает.Так что, если у вас есть прослушивающий сокет, который принял подключения, порт останется непригодным для использования в течение пары минут.

Перед тем, как привязать сокет к адресу прослушивания, вызовите setsockopt () для сокета с параметром= SO_REUSEADDR и значение 1.

0 голосов
/ 06 декабря 2010

Попробуйте

System.gc();

Документы говорят ...

void java.lang.System.gc () Указывает виртуальной машине, что было бы подходящее время длязапустить сборщик мусора.Обратите внимание, что это только подсказка.Нет никаких гарантий, что сборщик мусора действительно будет запущен.

...