2012-04-02 78 views
0

我有一個聊天應用程序(套接字編程),考慮到我有2個單獨的聊天服務器'Server1'&'Server2'。 我正在使用2個聊天服務器來進行負載均衡(Lvs)。我的LVS工作正常。客戶端如何處理「無法創建新的本地線程異常」在客戶端

例如:當1000個用戶一次嘗試登錄時,在LVS的影響下,500個請求轉到'server1',另外500個轉到'server2'。

這裏來我的問題:在「客戶端」

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: unable to create new native thread 

:當我嘗試登錄了5000個用戶,圍繞4850成功登錄後,我得到的錯誤。

我該如何處理?

僅供參考:我正在使用新固定線程池, 這裏是我在服務器端和客戶端使用的登錄部分。

在服務器端:

ExecutorService executorService = Executors.newFixedThreadPool(400); 
while(true){ 
    s = ss.accept(); 
} 

在登錄方面

for(int i=startc;i<endc;i++) // here for e.g if we want to login 1000 users, startc value =1 and endc value=1000. 
    { 
     ChatClient.chatHandler = new ChatClient("users"+i); 
    } 

ChatClient { 

public ChatClient(String username) 
    { 
     Chatclient = this; 
     this.username = username; 
     LoginChatConnect(); 
    } 
} 

void LoginchatConnect(){ 
try{ 
    sockChatListen = new Socket(URLstore.serverSocket,URLstore.ChatPort); // chatPort=5004,serverSocket=server Ip address. 
}catch (IOException e) { 
      System.out.println("IOException in LoginChat "+e); 
     } 
} 

任何建議將是有益的。

+0

我不明白你的問題。你是問客戶應該如何處理服務器內存不足的問題?我不確定它有可能,因爲它不會得到有關這種失敗的通知。 – Gray 2012-04-02 15:11:11

+0

是的,在客戶端我想避免這種異常。意味着有辦法處理這種情況。 – Java 2012-04-02 15:22:23

+0

客戶端或服務器端發生異常嗎?哪個VM耗盡內存?這不是你可以「處理」的東西。 – Gray 2012-04-02 15:25:06

回答

1

我覺得你想要做的是,你正在測試你的服務器應用程序,即通過運行測試應用程序,即客戶端聊天服務器。現在你必須在循環中運行特定的代碼。你的循環給你的內存異常,這是顯而易見的。如果你將繼續在無限循環中運行代碼,那麼它就會走到內存之外。

我會建議在有限循環中運行循環,就像在一臺客戶機上運行它4000次一樣,並且您可以在許多客戶機上運行多個測試代碼。在不同的機器上運行測試客戶端,例如每個客戶端運行循環4000次,以及您在4臺不同機器上運行的客戶端。所以輸出將是您的客戶端測試代碼不會因爲內存不足異常的失敗,你將能夠測試16K用戶登錄服務器應用程序..

它應該工作

0

顯然增加-Xmx參數到java會給你的應用程序更多的內存,但我不確定這是你問的問題。

# start our java program with 2 gigabyte of core memory 
java -Xmx2g ... 

通常,如果一個JVM得到這個例外,它是一個嚴重錯誤。當負載回落時,它可能會恢復,但任何調用分配new對象的調用都可能已經拋出,這會影響數據緩存,自動化等。通常,重新啓動應用程序是必需的。

當這種情況發生時,進程讓遠程進程知道內存不足將會非常困難。任何網絡操作都可能會產生額外的內存分配,這很可能會失敗。它當然可以看到它的內存級別,當它達到95%時它可以開始發出警告,但這是一個非常不精確的科學,因爲垃圾收集可能會在下一秒釋放大部分內存。

我們有內部的JVM監視器,它們會在舊版空間高於某個級別時啓動警告,但這僅適用於我們的操作屏幕。誤報在這裏很常見。只有當該級別超過警告級別一段時間,我們纔會進行調查。