Maison > Questions et réponses > le corps du texte
在不采用cms垃圾收集器或者在cms垃圾收集器初始标记和重新标记阶段,都会发生stop the world,也就是会暂停用户线程的执行,jvm是如何暂停所有用户线程的?烦请知道的朋友帮忙解答一下~
在实际场景中,可能gc的时间很短,但是暂停所有用户线程会用去很大一部分时间,这个时间又是如何得知的呢?
PHP中文网2017-04-18 10:07:31
JVM a quelque chose appelé « point de sécurité » et « zone de sécurité ». Lorsque GC se produit, tous les threads s'exécuteront jusqu'au « point de sécurité » et s'arrêteront.
Lorsque GC est requis, la JVM définira un indicateur. Lorsque le thread atteint un point sûr, il interrogera et détectera cet indicateur. S'il s'avère que GC est nécessaire, le thread se suspendra et ne reprendra pas son exécution. jusqu'à ce que le GC soit terminé.
Une autre stratégie consiste à suspendre directement tous les threads lorsque GC se produit, puis à détecter si tous les threads sont à un point sûr. S'ils ne le sont pas, reprenez l'exécution du thread et attendez que l'exécution atteigne un point sûr. point sûr avant de suspendre la montée.
Mais pour certains threads qui n'ont pas obtenu ou ne peuvent pas obtenir de temps CPU, il n'y a aucun moyen d'attendre qu'il atteigne un point sûr. Par conséquent, tant que le thread est dans la zone sûre à ce moment, GC peut également l'être. effectué. La zone de sécurité est un morceau de code, la relation de référence de l'objet dans ce segment de code ne changera pas, il est donc sûr d'effectuer GC à ce moment.
PHP中文网2017-04-18 10:07:31
La méthode Java permettant de suspendre les threads en toute sécurité n'est pas stable. Je pense que la méthode native devrait être utilisée pendant le Full GC.
Attirez de l'attention et apprenez. .
怪我咯2017-04-18 10:07:31
Essayez d'éviter le gc complet et réduisez l'utilisation de grands tableaux.
迷茫2017-04-18 10:07:31
GC ne sera pas très fréquent, il ne se produira que lorsque la mémoire est insuffisante (bien sûr ce n'est pas absolu), donc l'arrêt du monde ne sera pas très fréquent, ce qui garantit que cela n'affectera pas le thread utilisateur, et le thread utilisateur a un Dans la zone de sécurité, pour arrêter le monde, vous devez attendre que tous les threads soient dans la zone de sécurité. Il est possible que certaines opérations à long terme attendent longtemps pour atteindre la zone de sécurité. signifie que l'arrêt du monde peut attendre plus longtemps que le gc lui-même, et la façon de résoudre ce problème est de définir la zone de sécurité de manière raisonnable. Par exemple, il y a une grande différence entre pouvoir faire une pause dans la boucle et pouvoir le faire. faites une pause seulement une fois la boucle terminée. Le paramétrage spécifique de la zone de sécurité dépend de la décision du fabricant jvm