Ne peut pas passer 2542 Threads en Java sur 4 Go iMac OSX 10.6.3 Snow Leopard (32bit)

j'exécute le programme suivant en essayant de trouver comment configurer mon JVM pour obtenir le nombre maximum de threads que ma machine peut supporter. Pour ceux qui ne le savent peut-être pas, des vaisseaux Léopards avec Java 6.

j'ai essayé de le démarrer par défaut, et les lignes de commande suivantes, j'obtiens toujours la sortie de L'erreur de mémoire à Thread 2542 peu importe ce que les options JVM sont définies.

java TestThreadStackSizes 100000
java -Xss1024 TestThreadStackSizes 100000
java -Xmx128m -Xss1024 TestThreadStackSizes 100000
java -Xmx2048m -Xss1024 TestThreadStackSizes 100000
java -Xmx2048m -Xms2048m -Xss1024 TestThreadStackSizes 100000

peu importe ce que je passe, j'obtiens le même résultats, erreur de mémoire à 2542

public class TestThreadStackSizes
{
    public static void main(final String[] args)
    {
        Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            public void uncaughtException(final Thread t, final Throwable e)
            {
                System.err.println(e.getMessage());
                System.exit(1);
            }
        });
        int numThreads = 1000;
        if (args.length == 1)
        {
            numThreads = Integer.parseInt(args[0]);
        }

        for (int i = 0; i < numThreads; i++)
        {
            try
            {
                Thread t = new Thread(new SleeperThread(i));
                t.start();
            }
            catch (final OutOfMemoryError e)
            {
                throw new RuntimeException(String.format("Out of Memory Error on Thread %d", i), e);
            }
        }
    }

    private static class SleeperThread implements Runnable
    {
        private final int i;

        private SleeperThread(final int i)
        {
            this.i = i;
        }

        public void run()
        {
            try
            {
                System.out.format("Thread %d about to sleepn", this.i);
                Thread.sleep(1000 * 60 * 60);
            }
            catch (final InterruptedException e)
            {
                throw new RuntimeException(e);
            }
        }
    }
}

une idée de la façon dont je peux affecter ces résultats?

j'ai écrit ce programme pour comprendre ce qu'un serveur Windows 2003 est capable de, parce que je reçois ces out of memory can't create native threads à des nombres très bas, comme une centaine. J'ai besoin de voir ce qu'une boîte en particulier était capable de faire avec différents paramètres -Xss , puis je cours dans cette limite arbitraire sur OSX.

9
demandé sur feeling abused and harassed 2010-05-19 00:29:28

4 réponses

2542 semble comme un nombre arbitraire:

j'ai éteint tous les programmes sauf la fenêtre du terminal d'où je faisais mon test et je suis arrivé à 2545 , qui m'a dit que c'était une limite arbitraire.

pour obtenir le nombre de threads pour OSX 10.6.3 vous faites:

> sysctl kern.num_threads
kern.num_threads: 2560

et

> sysctl kern.num_taskthreads
kern.num_taskthreads: 2560

le nombre 2560 correspond au 2542 et 2545 parce qu'il y a évidemment d'autres fils courant à l'arrière-plan. Selon la documentation officielle kern.num_taskthreads ne peut pas être ajusté dans la version de bureau D'OSX.

10
répondu feeling abused and harassed 2016-01-11 23:07:09

selon le Apple Developer doc la taille de la pile de fils doit être au moins 64K, donc votre-XSS 1014 est ignoré. Mais même avec 64K par thread, la consommation de mémoire de la pile de threads ne s'élève qu'à environ 160MO, donc cela ne devrait pas être le problème. Les Threads pourraient également consommer la mémoire d'un pool plus limité, ou il pourrait tout simplement y avoir une limite sur le nombre de threads que vous pouvez avoir par processus ou utilisateur.

1
répondu FelixM 2010-05-18 21:14:23

pensez vous que vous avez beaucoup de threads simultanément jusqu'à 1 heure? Je ne le pense pas. J'ai travaillé dans l'application qui a traité des centaines de documents, les convertir de et à diff. formater, génère des journaux appropriés dans la base de données et stocke aussi des informations spécifiques. Puis aussi il fini en quelques secondes.

la chose que vous devez prendre soin de lui, code sagement pour éviter de faire trop de fils. Utilisez plutôt un ThreadPool fourni par Java, de sorte que les mêmes threads peuvent être utilisé en cas de besoin. cela fournira une meilleure performance. Gardez également la synchronisation sur les blocs minimaux pour éviter les goulots d'étranglement dans votre exécution.

merci.

1
répondu Parth 2010-05-21 06:05:43

vous devez trouver le nombre maximum de threads que le système d'exploitation supporte sur votre système.

sous linux, vous pouvez faire quelque chose comme:

cat /proc/sys/kernel/threads-max

pour obtenir le max, et pour le régler vous pouvez faire quelque chose comme :

echo 10000 > /proc/sys/kernel/threads-max

essayez aussi de courir avec:

-XX:-UseBoundThreads

et rapporter les résultats.

0
répondu Amir Afghani 2010-05-18 20:54:30