2010-12-06 45 views
2

我有項目中,我使用了大量的通過JNI訪問現有的C++代碼,打開和關閉插座開發Android應用程序。如何強制Android垃圾收集舊的套接字信息?

即使這個C++正確處理它打開插座的closeing,看來無論是Android操作系統或JVM保持周圍這些插槽引用/正在使用的端口直到下一次GC調用。

會發生什麼,如果我們停止應用程序,並再次啓動它的下一個GC調用之前,應用程序不能創建同一插座/端口上的連接。如果我們等待GC由OS調用和然後重新啓動應用程序,它成功地創建了連接。

有沒有辦法手動釋放從Android的/ JVM的角度來看,插座?也許是套接字類實用程序?手動呼叫GC?

回答

5

操作系統的TCP/IP協議棧保持TCP端口兩分鐘在應用程序關閉之後它們。所以如果你有一個已經接受連接的監聽套接字,端口將在幾分鐘內不能使用。

綁定之前套接字監聽地址,調用帶有選項= SO_REUSEADDR和1

+0

你是對的,它的setsockopt()而不是ioctl() – 2010-12-06 07:00:40

+0

感謝。這是我希望我在調試前要求50個工作小時的問題的答案... – Dfowj 2010-12-06 19:49:36

0

值在插座上setsockopt的()嘗試

System.gc(); 

文檔說...

void java.lang.System.gc() 向虛擬機 指示運行垃圾回收器的時機爲 。注意 ,這只是一個提示。沒有 保證垃圾收集器 將實際運行。