Configurazione delle dimensioni di cache per gli asset gestiti e il classloader di asset gestiti

In base al numero di applicazioni del processo che utilizzano le risorse gestite e al numero di file nelle risorse gestite, è possibile che si verifichi un rallentamento delle prestazioni quando si utilizzano le risorse gestite. Se la cache del programma di caricamento classi degli asset gestiti, la cache degli asset gestiti o entrambe le cache sono troppo piccole, le cache devono essere aggiornate spesso, riducendo le prestazioni. Ottimizzare le cache impostando i parametri di configurazione nel file 100Custom.xml per definire le dimensioni della cache per le risorse gestite.

Informazioni su questa attività

Impostare i parametri di configurazione seguenti per definire le dimensioni della cache per i file gestiti. Poiché le istantanee attive e il contenuto dell'asset gestito aumentano, potrebbe essere necessario aumentare le dimensione della cache. Se le dimensioni della cache sono troppo piccole, il thrashing può verificarsi quando le risorse gestite sono in uso perché gli oggetti del programma di caricamento classe spesso eseguono lo swap in entrata e in uscita dalla cache. Quando si verifica il thrashing, è possibile che vengano visualizzati thread in sospeso che mostrano ritardi relativi al codice ManagedAssetClassLoader .
Nota: evitare di utilizzare classi duplicate all'interno degli asset gestiti per un'istantanea, poiché non è possibile controllare quale classe carica.
<classloader-cache-size>
Ogni snapshot di un'applicazione del processo o di un toolkit contiene un'istanza del programma di caricamento classe. Assicurarsi che <classloader-cache-size> sia impostato su un valore superiore al numero totale di snapshot dell'applicazione del processo e del toolkit attive.
<classloader-resource-map-size>

Il parametro <classloader-resource-map-size> indica il numero di classi Java che le risorse gestite possono contenere e memorizzare nella cache in tutte le istantanee. La dimensione deve essere abbastanza grande da contenere tutti i file da tutti i file JAR dell'asset gestito nelle istantanee nell'ambiente di distribuzione. Quando più istantanee includono la stessa serie di file JAR della risorsa gestita, è necessario contare il contenuto del file più volte. Quando una snapshot del toolkit contiene risorse gestite, è necessario contare il contenuto del file solo una volta, indipendentemente dal numero di applicazioni del processo o toolkit a cui fa riferimento. Includere un buffer nella dimensione della cache impostata in modo che non superi il limite con un ulteriore sviluppo dell'applicazione. Il seguente esempio mostra come calcolare la dimensione della cache richiesta.

Tenere presente che è presente il seguente elenco di file JAR di risorse gestite in tutte le istantanee in uso:
  • file1.jar contenente 50 file di classe
  • file2.jar contenente 70 file di classe
  • file3.jar contenente 100 file di classe
Se si utilizza una riserva del 20%, impostare <classloader-resource-map-size> su (50 + 70 + 100) * 1.2 = 264.
Il seguente frammento XML mostra i valori predefiniti di queste proprietà. È possibile utilizzare questo frammento in 100Custom.xml per configurare le cache.
<server>
    <classloader-cache-size merge="replace">1000</classloader-cache-size>
    <classloader-resource-map-size merge="replace">5120</classloader-resource-map-size>
</server>
Per ulteriori informazioni su come apportare modifiche a 100Custom.xml, consultare Il file 100Custom.xml e la configurazione.

È possibile utilizzare i seguenti metodi per calcolare i requisiti di memoria per la cache dell'asset gestito e la cache del classloader dell'asset gestito. Se le dimensioni di queste cache causano problemi di memoria per i membri del cluster delle applicazioni, potrebbe essere necessario aumentare la dimensione heap Java.

Per ogni file nel file JAR della risorsa gestita, la memoria utilizzata dalle cache della risorsa gestita è la somma di due elenchi. Un elenco contiene l'asset e l'altro contiene una rappresentanza interna. Gli elenchi sono di tipo java.util.LinkedList, che utilizza una chiave e un valore. La chiave è composta da un UUID e dal percorso all'interno del file JAR. L'UUID è sempre 36 byte, ma la lunghezza del percorso e quindi la dimensione potrebbero variare. Questa chiave viene utilizzata da entrambi gli elenchi.

Il primo elenco contiene l'intero contenuto del file come valore. È necessario estrarre il file dal file JAR e controllare la dimensione del file. La rappresentazione interna che il secondo elenco contiene è sempre 52 byte. L'utilizzo della memoria per un file può essere rappresentato come segue:
2 x (UUID + path length) + file content + internal representation
Sostituendo i valori fissi, è possibile determinare la seguente formula:
2 x ( 36 bytes + path length) + file content + 52 bytes
Ad esempio, si consideri un file JAR che include i seguenti file:
* com/test/EchoService.class * com/test/EchoService.java, * META-INF/MANIFEST.MF * .classpath * .project
Anche se tutti questi file verranno caricati, per il momento considerare com/test/EchoService.class . Le dimensioni delle due liste sono:
  1. Primo elenco
    • Chiave = e9771549-3ff8-4d81-b678-f5dfee1b1b12, com/test/EchoService.class) = 36 byte
    • Lunghezza percorso = 26 byte
    • Valore = contenuto del file com/test/EchoService.class = 931 byte
  2. Secondo elenco
    • Chiave = e9771549-3ff8-4d81-b678-f5dfee1b1b12, com/test/EchoService.class) = 36 byte
    • Lunghezza percorso = 26 byte
    • Valore = "managedasset:61.f9b29441-0b1a-4f03-adfd-e98120b3c435" = 52 byte
Il numero totale di byte assegnati per un file nel file JAR è di 1107 byte. Per determinare l'utilizzo esatto della memoria del file JAR, è necessario calcolare l'utilizzo della memoria per ciascun file nel JAR.
La dimensione e la struttura del percorso di un file JAR influiscono sull'utilizzo della memoria. Quando si impacchettano i file JAR, tenere presenti quanto segue:
  • Quando si utilizza una risorsa gestita, viene caricato l'intero file JAR, incluso ogni file che contiene. Per ridurre la quantità di dati caricati, rimuovere i file non necessari dal file JAR. Gli asset gestiti vengono caricati in modalità Lazy. Quando si tenta di accedere a una classe in un file JAR, viene caricato l'intero file JAR.
  • L'utilizzo della memoria dipende dalle dimensioni del file e dalla lunghezza del percorso. Migliaia di file di piccole dimensioni in una struttura di pacchetti profonda potrebbero avere un impatto significativo sull'utilizzo della memoria.