2012-04-02 21 views
0

私はチャットアプリケーション(ソケットプログラミング)を持っています。これは2つの別々のチャットサーバー 'Server1' & 'Server2'を持っています。 2つのチャットサーバーを使用して負荷分散(Lv)を行っています。私のLVSは正常に動作しています。クライアントが "新しいネイティブスレッド例外を作成できません"とクライアントで対処する方法

たとえば、一度に1000人のユーザーがログインしようとすると、LVSの影響で500件のリクエストが 'server1'に、他の500件は 'server2'に送られます。

は、ここに私の問題が来る:「クライアント側」に

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

:私の周り4850ログイン成功後、5000人のユーザーのためにログインしようとしていたとき、私はエラーを取得しています。

これをどのように処理すればよいですか?

参考:私はnewfixedthreadpoolを使用しています。 ここは、サーバー側とクライアント側で使用しているログインの一部です。サーバー側では

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

+0

はい、クライアント側でこの例外を回避したいと思います。この状況に対処する方法があることを意味します。 – Java

+0

例外はクライアント側またはサーバー側で発生していますか?どのVMのメモリが不足していますか?これはあなたがちょうど "扱う"ことではありません。 – Gray

答えて

1

あなたは何をしようとしているかは、サーバーアプリケーション、つまりテストアプリケーション(つまりクライアント)を実行してチャットサーバーをテストすることです。今度はその特定のコードをループで実行する必要があります。 outofmemory例外を出すこのループは明らかです。あなたが無限ループでコードを実行し続けるならば、それはメモリから外れることになります。

1つのクライアントマシンで4000回実行するようなループをfinite forループで実行し、多くのクライアントマシンで複数のテストコードを実行することをお勧めします。異なるマシン上でテストクライアントを実行します。例えば、各クライアントは4000回のループを実行しています。クライアントは4つの異なるマシン上で実行しています。その出力がされます、あなたのクライアントのテストコードがあるためにOutOfMemory例外の失敗することはありません、あなたは16kのユーザログインのためのサーバーアプリケーションをテストすることができるようになります。..

それは

0

-Xmx引数をjavaに増やすと、アプリケーションのメモリが増えますが、それはあなたが求めているものではないことは明らかです。通常

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

JVMは、この例外を取得する場合には、重大なエラーです。負荷が戻ってくると回復する可能性がありますが、newオブジェクトを割り当てるコールがスローされた可能性があります。これはデータキャッシュや自動化などに影響します。通常、アプリケーションを再起動する必要があります。

この状態が発生した場合、プロセスがリモートプロセスにメモリ不足であることを知らせることは非常に困難になります。どんなネットワーク操作でも、おそらく失敗する可能性のある追加のメモリ割り当てが生成されるでしょう。確かにそれはメモリレベルを監視することができ、95%に達すると警告を送信し始める可能性がありますが、ガベージコレクションが次の秒間にメモリの大部分を解放する可能性があるので、これは非常に不正確です。

古いJVMスペースがあるレベルを超えて警告を開始する内部JVMモニタがありますが、これは操作画面のみです。ここでは偽陽性が一般的です。そのレベルが一定の期間、警告レベルを上回っている場合にのみ調査を行います。

関連する問題