Il tuo collega non ha idea di cosa stiano parlando.
La tua operazione più costosa sarebbe ascoltarli . Hanno sprecato il tuo tempo indirizzandoti in modo errato a informazioni che sono scadute da oltre un decennio (a partire dalla data originale in cui è stata pubblicata questa risposta) così come devi passare il tempo a postare qui e fare ricerche su Internet per la verità.
Speriamo di rigurgitare in modo ignorante qualcosa che hanno ascoltato o letto da più di dieci anni e che non conoscono meglio. Prenderò qualsiasi altra cosa che dicono come sospetto, questo dovrebbe essere un errore noto da chiunque si aggiorni in ogni caso.
Tutto è un oggetto (eccetto primitives
)
Tutto tranne le primitive ( int, long, double
, ecc.) sono oggetti in Java. Non c'è modo di evitare la creazione di oggetti in Java.
La creazione di oggetti in Java a causa delle sue strategie di allocazione della memoria è più veloce di Il C ++ nella maggior parte dei casi e per tutti gli scopi pratici rispetto a qualsiasi altra cosa nella JVM può essere considerato "gratuito" .
All'inizio della fine degli anni '90, le implementazioni JVM degli anni 2000 hanno avuto un sovraccarico di prestazioni nell'assegnazione effettiva di oggetti. Questo non è stato il caso almeno dal 2005.
Se tune -Xms
per supportare tutta la memoria necessaria per l'esecuzione corretta della tua applicazione, il GC potrebbe non dover mai eseguire e spazzare la maggior parte della spazzatura nelle moderne implementazioni di GC, i programmi di breve durata potrebbero mai GC a tutti .
Non cerca di massimizzare lo spazio libero, che è comunque un'aringa rossa, massimizza le prestazioni del runtime. Se ciò significa che l'heap di JVM è quasi del 100% allocato tutto il tempo, così sia. La memoria heap JVM gratuita non ti dà nulla rimanendo lì comunque.
Vi è un equivoco sul fatto che il GC libererà la memoria nel resto del sistema in un modo utile, questo è completamente falso!
L'heap JVM non cresce e si riduce in modo che il resto del sistema sia influenzato positivamente dalla memoria libera nell'heap JVM . -Xms
alloca TUTTO ciò che è specificato all'avvio e la sua euristica è di non rilasciare mai realmente alcuna di quella memoria sul sistema operativo per essere condivisa con altri processi del sistema operativo fino a che l'istanza di JVM non si chiude completamente. -Xms=1GB -Xmx=1GB
alloca 1 GB di RAM indipendentemente dal numero di oggetti effettivamente creati in un dato momento. Esistono alcune impostazioni che consentono di rilasciare le percentuali della memoria heap, ma per tutti gli scopi pratici la JVM non è mai in grado di rilasciare una quantità sufficiente di questa memoria affinché ciò avvenga mai , quindi nessun altro processo può recuperare questa memoria, quindi il resto del sistema non beneficia del fatto che l'Heap JVM sia libero . Un RFE per questo era "accettato" 29-NOV-2006, ma non è mai stato fatto nulla al riguardo. Questo comportamento non è considerato un problema da parte di chiunque dell'autorità.
Vi è un equivoco sul fatto che la creazione di molti piccoli oggetti di breve durata fa sì che la JVM si fermi per lunghi periodi di tempo, anche questo è falso
Gli attuali algoritmi GC sono ottimizzati per la creazione di molti molti piccoli oggetti di breve durata, ovvero l'euristica al 99% per gli oggetti Java in ogni programma. I tentativi di Pool di oggetti renderanno la JVM peggiore nella maggior parte dei casi.
Gli unici oggetti che hanno bisogno di raggruppare oggi sono oggetti che fanno riferimento a risorse finite che sono esterne alla JVM; Socket, file, connessioni database, ecc. E possono essere riutilizzati. Gli oggetti normali non possono essere raggruppati nello stesso senso delle lingue che consentono l'accesso diretto alle posizioni di memoria. L'oggetto caching è un concetto diverso e può o non può essere quello che alcune persone chiamano ingenuamente pooling , i due concetti non sono la stessa cosa e non dovrebbero essere confusi.
I moderni algoritmi GC non presentano questo problema perché non rilasciano deal in una pianificazione, ma rilasciano deallocate quando è necessaria memoria gratuita in una determinata generazione. Se l'heap è abbastanza grande, nessuna deallocazione si verifica abbastanza a lungo da causare pause.
I linguaggi dinamici orientati agli oggetti stanno battendo C anche ora i giorni in termini di calcolo sensibile test.