客户如何处理"无法创建新的本机线程异常"在客户端上

时间:2012-04-02 15:07:52

标签: java multithreading sockets threadpool out-of-memory

我有一个聊天应用程序(套接字编程),因为我认为我有2个独立的聊天服务器'Server1'& 'Server2'。 我使用2个聊天服务器进行负载均衡(Lvs)。我的LVS工作正常。

例如:当1000个用户一次尝试登录时,由于LVS的影响,500个请求进入“server1”,其他500个进入“server2”。

我的问题出现了:当我尝试登录5000个用户时,大约4850成功登录后,我收到错误:

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

在“客户端”。

我该如何处理?

供参考:我正在使用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);
        }
}

任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:1)

我认为您要做的是,您正在通过运行测试应用程序即客户端来测试您的服务器应用程序,即聊天服务器。现在你必须在循环中运行该特定代码。你的这个循环给你outofmemory异常,这是显而易见的。如果你继续在无限循环中运行代码,那么它必然会走向存在。

我建议在有限循环中运行循环,比如在一台客户端计算机上运行4000次,并且可以在许多客户端计算机上运行多个测试代码。在不同的机器上运行测试客户端,例如每个客户端运行循环4000次,以及您在4台不同的机器上运行的此类客户端。因此输出将是,您的客户端测试代码不会因为内存异常而失败,您将能够测试您的服务器应用程序是否有16k用户登录..

它应该有用

答案 1 :(得分:0)

显然,将-Xmx参数增加到java将为您的应用程序提供更多内存,但我不确定这是您所要求的。

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

通常,如果JVM收到此异常,则为严重错误。当负载回落时,它可能能够恢复,但任何调用分配new对象可能已经抛出,这将影响数据缓存,自动化等。通常需要重新启动应用程序。

当这种情况发生时,进程很难让远程进程知道内存不足。任何网络操作都可能产生额外的内存分配,很可能会失败。它当然可以看到它的内存级别,当它达到95%时它可以开始发出警告,但这是一个非常不精确的科学,因为垃圾收集可能会在下一秒释放大部分内存。

我们有内部JVM监视器,它们会在旧版本空间超过某个级别时启动警告,但这仅适用于我们的操作屏幕。误报在这里很常见。只有当该级别在一段时间内保持在警告级别之上时,我们才进行调查。