2010-05-12 5 views
12

Je suis vraiment curieux de savoir comment fonctionne la JVM avec les threads! Lors de mes recherches sur Internet, j'ai trouvé du matériel sur RTSJ, mais je ne sais pas si c'est la bonne direction pour mes réponses. J'ai également trouvé ce sujet dans les forums du soleil, http://forums.sun.com/thread.jspa?forumID=513&threadID=472453, mais ce n'est pas satisfaisant.Qu'est-ce que l'algorithme de planification JVM?

Est-ce que quelqu'un peut me donner des directions, du matériel, des articles ou des suggestions sur l'algorithme de planification de la JVM? Je cherche également des informations sur les configurations par défaut des threads Java dans le planificateur, comme «combien de temps cela prend-il pour chaque thread» en cas de découpage temporel. Et ce truc.

J'apprécierais n'importe quelle aide!

Merci!

Répondre

17

Il n'y a pas de machine virtuelle Java unique; La JVM est une spécification, et il y a plusieurs implémentations, y compris la version OpenJDK et la version Sun de celle-ci, entre autres. Je ne sais pas avec certitude, mais je suppose que toute JVM raisonnable utiliserait simplement le mécanisme de thread sous-jacent fourni par le système d'exploitation, ce qui impliquerait POSIX Threads (pthreads) sous UNIX (Mac OS X, Linux, etc.) et impliquent des discussions WIN32 sur Windows. En règle générale, ces systèmes utilisent une stratégie round-robin par défaut.

+0

Il existe la spécification de machine virtuelle Java (http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html) ou "Spécification JVM". Mais quand quelqu'un parle d'une "JVM" ou d'une "JVM", cela signifie généralement une implémentation de la spécification et non la spécification elle-même. –

+0

@Sauer, oui, le terme "JVM" implique une seule JVM, et bien que cela ait du sens dans le contexte d'une discussion sur une JVM particulière (par exemple la JVM Sun HotSpot), cela n'a aucun sens sans établir quel La JVM est en cours de discussion. –

+0

Personnellement, je me retrouve souvent à dire des choses comme "la JVM chargera la classe ..." ou "la JVM s'assurera que ..." ce qui * fait * certainement référence à une implémentation, bien que cela ne soit pas pertinent pour la discussion mise en œuvre concrète dont je parle. D'un autre côté, quand je parle spécifiquement de la spécification, alors cela devrait être noté "La spécification JVM spécifie, que ..." ou quelque chose comme ça. –

2

Ce n'est pas le cas. La machine virtuelle Java utilise des threads natifs du système d'exploitation. Le système d'exploitation effectue donc la planification et non la machine virtuelle Java.

+2

Certaines machines virtuelles Java gèrent leurs propres unités d'exécution. La première JVM de Sun l'a fait. Certaines petites JVM embarquées modernes le font également. –

+0

@Will Hartung: vrai, http: //en.wikipedia.org/wiki/Green_threads dit que la JVM Hotspot a utilisé des threads natifs depuis 1,2 jours –

+0

non, l'article dit que la JVM 1.1 les a utilisés sur Solaris, et je me souviens d'eux étant utilisé par la JVM Linux quand il s'appelait encore Blackdown, mais je suis à peu près sûr que Hotspot (qui est devenu une partie de la JVM seulement en 1.3) n'a jamais utilisé de threads verts. –

2

Il ya quelque temps, j'ai écrit quelques articles sur thread scheduling du point de vue de Java. Cependant, sur les plates-formes grand public, le comportement du thread dépend essentiellement de l'enfilage du système d'exploitation sous-jacent. Jetez un coup d'oeil en particulier sur ma page sur Java thread priority, qui explique comment les niveaux de priorité de Java correspondent aux priorités de threads sous-jacentes du système d'exploitation et comment, en pratique, les threads de différentes priorités se comportent sur Linux et Windows. Une différence majeure discutée est que sous Linux il y a plus de relation entre la priorité des threads et la proportion de CPU allouée à un thread, alors que sous Windows ce n'est pas le cas (voir les graphiques).

0

Je n'ai pas de droits de commentaire si l'écriture est ici ... JVM appelle pthreads (mécanisme de threading généralement utilisé, d'autres variantes sont là) pour chaque requête correspondante. Mais la planification ici est entièrement faite par OS agissant en tant qu'hôte. Mais c'est une approche préférée et il est possible de planifier ces threads par JVM. Par exemple, dans Jikes RVM, il existe des options pour remplacer cette approche de la décision OS. Par exemple, les threads sont appelés RVMThread et peuvent être planifiés/manipulés à l'aide des classes de package org.jikesrvm.schedular. Pour plus reference