我有一个项目,我正在使用通过JNI访问的许多现有C ++代码开发Android应用程序,这些代码可以打开和关闭套接字。
即使这个C ++正确处理它打开的套接字的关闭,似乎Android OS或JVM仍然保留对下一次GC调用之前使用的那些套接字/端口的引用。
如果我们在下一次GC调用之前停止应用并再次启动应用程序,则应用程序无法在同一个套接字/端口上创建连接。如果我们等待操作系统调用GC并且然后重新启动应用程序,它会成功创建连接。
有没有办法从Android / JVM的角度手动释放套接字?也许是套接字类实用程序?手动调用GC?
答案 0 :(得分:5)
应用程序关闭后,操作系统的TCP / IP协议栈会保留TCP端口两分钟。因此,如果您有一个已接受连接的侦听套接字,该端口将在几分钟内保持不可用。
在将套接字绑定到侦听地址之前,请使用选项= SO_REUSEADDR并使用值1来调用套接字上的setsockopt()。
答案 1 :(得分:0)
尝试
System.gc();
文件说......
void java.lang.System.gc() 表示虚拟 机器,这将是一个美好的时光 运行垃圾收集器。注意 这只是一个提示。没有 保证垃圾收集器 实际上会被运行。