2012-04-02 84 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监视器,它们会在旧版空间高于某个级别时启动警告,但这仅适用于我们的操作屏幕。误报在这里很常见。只有当该级别超过警告级别一段时间,我们才会进行调查。