Stiamo provando a modificare alcune opzioni di Garbage Collection Oracle JVM e uno sviluppatore ha provato a utilizzare -XX:PretenureSizeThreshold
per assicurarsi che una vasta serie di oggetti sia stata inserita in Tenured subito. Sono abbastanza sicuro che l'ipotesi fosse che la dimensione dell'array uguaglia o superi la dimensione totale di tutti gli oggetti in essa contenuti.Come vengono gestiti gli array di oggetti Java?
Ma in Java, non sono matrici di oggetti solo matrici di riferimenti? Cioè ogni oggetto nell'array, così come l'oggetto stesso dell'array, è separato in memoria e trattato separatamente dal garbage collector? Penso che l'oggetto array possa ancora diventare abbastanza grande se ci sono milioni di voci, ma non dovrebbe essere vicino alla dimensione totale degli oggetti che "contiene" se ogni oggetto è molto più grande di un riferimento.
Penso che ci sia confusione, perché per quanto ne so, in C:
- E 'possibile avere una serie di
struct
s che realmente memorizzare istruct
s. - E 'anche possibile avere una serie di puntatori a
struct
s.
Sono sicuro che Java usa sempre 1. per matrici di tipi primitivi e usa sempre 2. per matrici di oggetti, mentre C può usare per qualsiasi tipo ...?
Cosa succede se utilizzo un append()
s frequente (come nel caso in questione)? Viene solo copiata la matrice e non gli oggetti nell'array? Inoltre, quando l'array viene copiato, anche se il vecchio array era in Tenured, quello nuovo inizia in Eden, giusto?
Sei sostanzialmente corretto. In Java una matrice di non primitivi è sempre una matrice di riferimenti.E se un ArrayList viene riallocato, il nuovo array inizia "fresco". (Questo non vuol dire che alcune JVM non abbiano scenari di casi speciali, ma che sarebbe praticamente una tantum e mirate a una situazione specifica (cioè di benchmark critico). –