Prestazioni della memoria
I problemi di prestazioni si riscontrano generalmente nell'utilizzo complessivo della memoria delle applicazioni ThingWorx. Se l'applicazione fa un uso eccessivo dell'heap della memoria Java e crea e scarta continuamente oggetti di memoria di grandi dimensioni, nei criteri di misurazione della memoria per il sistema vengono visualizzati indicatori che segnalano prestazioni insufficienti. La frequenza e la durata delle garbage collection Java rivestono un ruolo significativo nella velocità di risposta complessiva del sistema. In presenza di loop continui di garbage collection, si verifica un sovraccarico della memoria dell'applicazione, con la possibilità che la piattaforma ThingWorx smetta di rispondere.
Per monitorare l'utilizzo della memoria Java e la garbage collection nel tempo, è consigliabile attivare la registrazione del GC. Strumenti quali PSM o VisualVM inoltre visualizzano informazioni sull'utilizzo della memoria. Tuttavia, se la JVM non risponde a causa di loop completi del GC, queste applicazioni esterne potrebbero non essere in grado di recuperare i dati per mostrare i problemi di memoria.
Quando si monitora la memoria a livello di sistema operativo, non vengono fornite informazioni sull'uso della memoria allocata da parte dell'applicazione ThingWorx. Lo strumento di monitoraggio recupera i dati relativi alla quantità di memoria Java richiesta dal sistema operativo, ma non mostra il modo in cui Java utilizza la memoria. La maggior parte dei problemi relativi alle prestazioni è dovuta all'utilizzo della memoria interna nello spazio degli heap Java, non alle allocazioni di memoria del sistema operativo.
La memoria complessiva allocata a Java è determinata dai parametri -Xms (minimo) e -Xmx (massimo) caricati in fase di esecuzione. I parametri -Xms e -Xmx specificano la dimensione del pool di memoria iniziale e massima, se Tomcat viene configurato utilizzando il pannello di configurazione tomcat8w.
Se all'avvio non sono specificati valori minimi o massimi, il processo Java all'avvio utilizza un'euristica per preallocare queste quantità. Per default, Java tenta di allocare un quarto della RAM complessiva disponibile nel sistema operativo.
Operazioni che causano problemi di memoria
È necessario monitorare le operazioni riportate di seguito, che possono causare problemi di memoria.
Operazioni del GC complete estremamente lunghe e frequenti la cui durata supera i 45 secondi - In quanto operazioni "stop the world", i GC completi non sono auspicabili. Più a lungo viene sospesa la JVM, maggiori sono i problemi di memoria:
Tutti gli altri thread attivi vengono interrotti mentre la JVM tenta di rendere disponibile una maggiore quantità di memoria.
I GC completi richiedono tempo considerevole, talvolta minuti, durante i quali l'applicazione potrebbe non rispondere.
GC completi che si verificano in un loop - I GC completi che si verificano in rapida successione sono detti loop di GC completi. Possono provocare i problemi riportati di seguito.
Se la JVM non è in grado di pulire la memoria aggiuntiva, il loop può continuare indefinitamente.
L'applicazione ThingWorx non è disponibile per gli utenti mentre il loop continua.
Perdite di memoria - Si verificano perdite di memoria nell'applicazione quando nella memoria viene mantenuto un numero crescente di oggetti. Questi oggetti non possono essere puliti, indipendentemente dal tipo di garbage collection eseguito dalla JVM.
Quando si controlla il consumo di memoria nel tempo, viene rilevato che la perdita di memoria è conseguenza di un utilizzo sempre crescente della memoria, senza alcun recupero.
Indipendentemente dai limiti superiori impostati, a lungo andare la memoria del server si esaurisce.