Как клиент может иметь дело с «невозможно создать исключение для собственного нити» на клиенте - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть приложение чата (Socket Programming), для этого учтите, что у меня есть 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 ]

1 голос
/ 03 апреля 2012

Я думаю, что вы пытаетесь сделать, вы тестируете свое серверное приложение, т.е. сервер чата, запуская тестовое приложение, то есть клиент. теперь вы должны запустить этот конкретный код в цикле. этот твой цикл дает тебе исключение из памяти, что очевидно. если вы будете продолжать выполнять код в бесконечном цикле, то он обязательно выйдет из памяти.

Я предлагаю запустить цикл в конечном цикле for, как запустить его 4000 раз на одном клиентском компьютере, и вы можете запустить несколько тестовых кодов на многих клиентских компьютерах. запустите тестовый клиент на другой машине, например, на каждом клиенте в цикле 4000 раз, и таких клиентов вы используете на 4 разных машинах. поэтому вывод будет таким, что ваш клиентский тестовый код не потерпит неудачу из-за исключения из неофициальной памяти, и вы сможете протестировать свое серверное приложение на 16 тыс. входов пользователей.

должно работать

0 голосов
/ 02 апреля 2012

Очевидно, что увеличение аргумента -Xmx до java даст вашему приложению больше памяти, но я не уверен, что вы об этом спрашиваете.

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

Обычно, если JVM получает это исключение, критическая ошибка .Когда нагрузка падает вниз, она может быть в состоянии восстановить, но любой вызов для выделения объекта new может быть сгенерирован, что повлияет на кеширование данных, автоматизацию и т. Д. Обычно требуется перезапуск приложения.

Когда возникает такое условие, процессу будет крайне трудно сообщить удаленному процессу, что ему не хватает памяти.Любая сетевая операция, вероятно, будет генерировать дополнительные выделения памяти, которые, скорее всего, не удастсяКонечно, он может наблюдать за уровнем своей памяти, и когда он достигает 95%, он может начать отправлять предупреждения, но это очень неточная наука, учитывая, что сборка мусора может освободить большой процент памяти в следующую секунду.

У нас есть внутренние мониторы JVM, которые запускают предупреждение, когда пространство старого поколения становится выше некоторого уровня, но это только для наших рабочих экранов.Ложные срабатывания распространены здесь.Только если этот уровень остается выше уровня предупреждения в течение определенного периода времени, мы проводим расследование.

...