O que causa longos tempos de rotação e sincronização em Java?
No Java 8, atualização 45, adicionando essas opções aojava
ligar:
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount=1
mostra-me estatísticas como estas:
vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count
3679.229: no vm operation [ 72 1 2 ] [ 6016 0 6016 0 0 ] 1
2015-05-22T11:25:27.519+0200: Total time for which application threads were stopped: 6.0168551 seconds, Stopping threads took: 6.0164099 seconds
O problema aqui é o longo tempo paraStopping threads
. Neste exemplo, são 6 segundos, o que já é um problema para nosso aplicativo, mas já vi tempos ainda maiores, em uma instância (sem registro completo, no entanto) totalizando quase um minuto.
A operação da VM (aqui:no vm operation
) está variando. Eu também vi, por exemploRevokeBias
, G1IncCollectionPause
ouGCG_Operation
. Também opage_trap_count
parece ser irrelevante. Já vi exemplos em que 0 e outros em 2. Constante, porém, é que o tempo sempre se reflete nos valores despin
esync
.
Estou procurando uma explicação detalhada desses valores de tempospin
esync
, mas principalmente estou interessado em saber por que isso está acontecendo e no que posso fazer contra isso. Não conheço nada de "mal" em nossa configuração. Há muitos núcleos entediados e memória não utilizada na máquina, estamos executando Java puro (sem JNI) e não temos conhecimento de nenhuma sincronização excessiva em nosso código.