jsf - library - mojarra version



Consumo di memoria JSF 2.2: Perché Mojarra mantiene i bean ViewScoped delle ultime 25 viste in memoria? (0)

La memoria per sessione aumenta

Stiamo sperimentando un consumo di memoria elevato utilizzando JSF 2.2 (2.2.12) con Mojarra. Dopo aver esaminato i nostri test di carico, è emerso che la dimensione dei dati nei nostri bean ViewScoped è piuttosto alta (a volte superiore a 1 MB). In ogni caso, durante la navigazione dalla vista alla vista, le dimensioni della memoria della sessione aumentano e aumentano. Non possiamo ridurre la dimensione dei fagioli a breve termine, quindi questo comportamento ha lasciato qualche impatto.

Soluzione 1 - Cambiare il contesto Params (non funzionante)

Ora - abbiamo giocato con il parametro di contesto ufficiale di Mojarra che sono impostati su 15 per impostazione predefinita:

com.sun.faces.numberOfLogicalViews
com.sun.faces.numberOfViewsInSession

La modifica di tali parametri su un valore inferiore non ha avuto alcun impatto sul consumo di memoria nei nostri test di carico.

Soluzione 2 - Modifica di activeViewMapsSize (funzionante)

Stavamo ViewScopeManager debug di Mojarra e trovato il seguente codice in ViewScopeManager :

Integer size = (Integer) sessionMap.get(ACTIVE_VIEW_MAPS_SIZE);
if (size == null) {
    size = 25;
}

La dimensione predefinita per mantenere le ultime visualizzazioni visitate sembra essere 25. Vedendo questo, abbiamo implementato un listener di sessione che imposta questo valore su 1:

public class SetActiveViewMapsSizeSessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent event) {
        event.getSession().setAttribute(ViewScopeManager.ACTIVE_VIEW_MAPS_SIZE, 1);
    }
}

Questo ovviamente ha funzionato. La memoria ha smesso di crescere dal momento che solo 1 vista è mantenuta.

Allora perché 25 visualizzazioni in memoria?

Quindi Mojarra mantiene una cronologia di 25 viste in memoria se non è definito un valore diverso in Session. Non riesco a trovare alcuna documentazione su questo. Qualcuno può spiegare a cosa serve? È per il browser indietro? Abbiamo il caching disabilitato sulle nostre pagine JSF. Quindi il browser indietro creerà sempre una nuova vista. Questo non dovrebbe essere un problema per noi.

La soluzione 2 è un approccio valido? Qualcuno potrebbe spiegare gli svantaggi di questo approccio?

Aggiornamento 1

Dopo vari commenti e un debugging più profondo, si è scoperto che:

  • com.sun.faces.numberOfLogicalViews definisce la dimensione logicalViewMap, che memorizza solo (!) lo stato dell'albero dei componenti ui
  • com.sun.faces.application.view.activeViewMapsSize definisce la dimensione di activeViewMap, che contiene i bean ViewScoped

Quando si modifica numberOfLogicalViews su 1, mojarra continuerà a tenere traccia di tutti i bean con scope vista delle ultime 25 visualizzazioni. Quando lo configuri al contrario - numberOfLogicalViews a 15 e activeViewMapsSize a 1 - la vista non può essere correttamente inizializzata a causa di dati mancanti, suppongo. Non abbiamo nemmeno ricevuto un'eccezione. Mi piacerebbe capire perché mojarra ha scelto di impostare activeViewMapsSize più in alto di numberOfLogicalViews e non lo stesso, dal momento che vogliamo ottimizzare il consumo di memoria senza ottenere un comportamento imprevedibile.

Aggiornamento 2

Abbiamo creato un problema a Mojarra JAVASERVERFACES-4015





mojarra