Nel mio attuale progetto Java EE ho un'attività abbastanza comune: carica gli oggetti dal database usando Hibernate
, trasferiscili in un'altra struttura oggetto (basata su XSD) e serializzali usando JAXB
. Per semplificare lo scenario, immagina che l'XML che voglio così serializzare sia un file con record di informazioni per le richieste che otteniamo. In teoria ci possono essere record di informazioni infiniti per le richieste, ma stimiamo un numero pessimista ma ancora realistico di record che devo serializzare.
Per prima cosa ho fatto una stima approssimativa della dimensione del file XML risultante e sono arrivato a 292 MB (circa 9 KB per singolo record). Mi aspettavo già che le dimensioni del file superassero le dimensioni massime dell'heap di 50MB che una richiesta java potesse raccogliere dai nostri operatori / amministratori del server. Quindi ho bisogno di trovare un limite per suddividere i record in diversi processi e file. So che non posso semplicemente ridurre il numero di record da serializzare in un file con le dimensioni del file risultante, il che significa che non posso calcolare "ok, i record x sono 200 MB, i record x / 4 sono 50 MB e ciò si adatta al heap massimo ". Di sicuro devo tenere a mente gli oggetti caricati e la struttura degli oggetti che serializzo.
Ma come posso stimare approssimativamente la dimensione dell'heap necessaria per la dimensione finale di un singolo record in modo da poter serializzare un numero massimo di record senza incorrere in problemi di memoria? Come detto, un calcolo approssimativo è sufficiente, ad esempio "se la dimensione finale per record è 6KB, allora hai bisogno di 12KB (rapporto 1: 2) per elaborarlo nel tuo processo.