Programa Java está ficando mais lento após a execução por um tempo

Eu tenho um programa java que é um algoritmo típico de aprendizado de máquina, atualizando os valores para alguns parâmetros por algumas equações:

for (int iter=0; iter<1000; iter++) {
    // 1. Create many temporary variables and do some computations                         
    // 2. Update the value for the parameters                    
}

Os cálculos dos parâmetros de atualização são bastante complexos, e eu tenho que criar muitos objetos temporários, mas eles não são referenciados fora do loop. O código no loop consome muita CPU e não acessa o disco. Este programa carrega um conjunto de dados de treinamento relativamente grande, portanto, concedai 10G de memória (-Xmx10G) à JVM, que é muito maior do que o necessário (pico em ~ 6G pelo comando "top" ou pelo gerenciador de tarefas da janela).

Testei-o em várias máquinas Linux (centos 6, 24G de memória) e uma janela (win7, 12G), ambas com o SUN Hotspot JDK / JRE 1.8 instalado. Não especifiquei outros parâmetros da JVM, exceto -Xmx. Ambas as máquinas são dedicadas ao meu programa.

No Windows, meu programa roda bem: cada iteração usa um tempo de execução muito semelhante. No entanto, o tempo de execução em todas as máquinas centos é estranho.Inicialmente, ele é executado corretamente, mas diminui drasticamente (~ 10 vezes mais devagar) na 7ª / 8ª iteração e depois fica lento ~ 10% em cada iteração para sempre.

Eu suspeito que isso possa ter sido causado pelo coletor de lixo do Java. Portanto, eu uso o jconsole para monitorar meu programa. O GC menor acontece com muita frequência nas duas máquinas, porque o programa cria muitas variáveis temporárias no loop. Além disso, usei o comando "jstat -gcutil $ pid $ 1s" e capturei as estatísticas:

Centos:https://www.dropbox.com/s/ioz7ai6i1h57eoo/jstat.png?dl=0

Janela:https://www.dropbox.com/s/3uxb7ltbx9kpm9l/jstat-winpng.png?dl=0

[Editado] No entanto, as estatísticas sobre dois tipos de máquinas diferem bastante:

"S1" no Windows salta rapidamente entre 0 e 50, enquanto permanece em "0,00" nos centos."E" no Windows muda muito rapidamente de 0 a 100. Enquanto eu imprimo o stat a cada segundo, a captura de tela não mostra seu incremento para 100. No centos, no entanto, "E" aumenta lentamente para 100 e depois reduz para 0 e aumenta novamente.

Parece que o comportamento estranho do meu programa é devido ao Java GC? Eu sou novo no monitor de desempenho Java e não tenho uma boa idéia para otimizar a configuração de parâmetros do GC. Você tem alguma sugestão? Muito obrigado!

questionAnswers(7)

yourAnswerToTheQuestion