McGovernTheory fez essa pergunta em Stackoverflow:
Quantos threads uma máquina virtual Java suporta no máximo? Está relacionado a desenvolvedores de máquinas virtuais? E o sistema operacional? Existem outros fatores?
Resposta de Eddie:
Depende da CPU que você está usando, do sistema operacional, do que outros processos estão fazendo, da versão do Java que você está usando e outros fatores. Eu já vi um servidor Windows com mais de 6500 threads antes de cair. Obviamente, a maioria dos tópicos não faz nada. Uma vez que houver quase 6500 threads (em Java) em uma máquina, a máquina começará a ter problemas e se tornará instável.
Na minha experiência, os threads contidos na JVM estão positivamente correlacionados com o desempenho do próprio computador.
Obviamente, você precisa ter memória nativa suficiente e alocar memória suficiente para Java para que cada encadeamento possa ter uma pilha (pilha de máquinas virtuais) e fazer o que você quiser. Qualquer máquina com uma CPU moderna (AMD ou as gerações recentes da Intel) e a memória 1-2G (dependendo do sistema operacional) podem suportar facilmente uma máquina virtual Java com milhares de threads.
Se você precisar de uma resposta mais precisa, é melhor fazer o teste de estresse.
Resposta de Charlie Martin:
Existem muitos parâmetros (podem ser definidos). Para máquinas virtuais específicas, elas terão seus próprios parâmetros de tempo de execução. (Número máximo de threads) até certo ponto, é determinado pelo sistema operacional: que suporte o sistema operacional subjacente deve fornecer aos threads? Que restrições são impostas? A máquina virtual usa a rosca do sistema operacional nativo, ou rosca vermelha ou rosca verde?
O suporte fornecido pelo sistema operacional é outro problema. Se você escrever um programa Java como este:
A cópia do código é a seguinte:
classe DieliKeADOG {
public static void main (string [] argv) {
para(;;){
novo thread (novo SomerUnaable) .start ();
}
}
}
(Não reclame dos detalhes da sintaxe, isso está apenas começando), é claro que você deseja obter centenas de threads em execução. No entanto, o custo da criação de um fio é relativamente alto, e a sobrecarga de (muitos threads) agendamento se torna proeminente. Ainda é incerto se esses tópicos podem fazer coisas úteis.
Versão atualizada
Ok, mal posso esperar! Aqui está um pequeno programa de teste que foi levemente polido:
Copie o código da seguinte
objeto estático privado s = new Object ();
private estático int contagem = 0;
public static void main (string [] argv) {
para(;;){
novo thread (novo runnable () {
public void run () {
Sincronizado (s) {
contagem += 1;
System.err.println ("novo thread #"+contagem);
}
para(;;){
tentar {
Thread.sleep (1000);
} catch (Exceção e) {
System.err.println (e);
}
}
}
}).começar();
}
}
}
No sistema OS/X 10.5.6 da Intel, a saída de Java 5 é a seguinte:
A cópia do código é a seguinte:
Novo tópico #2547
Novo tópico #2548
Novo tópico #2549
Não é possível criar thread: 5
Novo tópico #2550
Exceção no thread "Main" java.lang.outOfMemoryError: Não é possível criar um novo thread nativo
em java.lang.thread.start0 (método nativo)
em java.lang.thread.start (thread.java:592)
em DieliKeadog.main (Dielikeadog.java:6)
Resposta de Benjismith:
Depois de ler a resposta de Charlie Martin, eu queria saber se o tamanho da memória da heap pode fazer a diferença no número de threads criados e depois fiquei surpreso com o resultado: no sistema SP1 Premium Home, usando o JDK 1.6.0_11, Defina o tamanho da memória da heap de 2m a 1024m para executar o programa de teste de Charlie. Por exemplo: para criar memória de 2M de heap, os parâmetros da máquina virtual que eu uso são: -xms2m -xmx2m.
Aqui estão os resultados dos meus testes:
Copie o código da seguinte
4 MB -> 5743 threads
8 MB -> 5735 threads
12 MB -> 5724 threads
16 MB -> 5712 threads
24 MB -> 5687 threads
32 MB -> 5662 threads
48 MB -> 5610 threads
64 MB -> 5561 threads
96 MB -> 5457 threads
128 MB -> 5357 threads
192 MB -> 5190 threads
256 MB -> 5014 threads
384 MB -> 4606 threads
512 MB -> 4202 threads
768 MB -> 3388 threads
1024 MB -> 2583 threads
Então, o tamanho da pilha é realmente importante. No entanto, o tamanho da pilha e o número máximo de encadeamentos são inversamente proporcionais.
Isso é tão estranho!
Resposta de Neil Coffey:
O número máximo teórico absoluto de threads é o espaço de endereço do processo do processo dividido pelo tamanho da pilha de threads (na realidade, se toda a memória for usada pela pilha de threads, não haverá um programa que possa ser executado). Portanto, pegando o sistema Windows de 32 bits como exemplo, o espaço de endereço do usuário de cada processo é 2G. . Na verdade, no sistema XP, descobri que cerca de 13.000 threads podem ser iniciados.
Então, acho que sua pergunta é essencialmente: (a) Se você pode gerenciar efetivamente muitos threads em seu código e não deixá -los fazer isso é obviamente estúpido (como: deixe -os no mesmo objeto (b) se o sistema operacional pode gerenciar efetivamente esses muitos threads. Basicamente, se (a) a resposta é "sim", a resposta (b) é "sim".
Coincidentemente, você pode definir o tamanho da pilha do encadeamento no construtor de threads, mas não precisa e não deve confundir isso com os parâmetros da máquina virtual.