Il tuo collega non ha idea di cosa stia parlando.
La tua operazione più costosa sarebbe ascoltarli . Hanno sprecato il tuo tempo a indirizzarti erroneamente verso informazioni obsolete di oltre un decennio (alla data originale in cui è stata pubblicata la risposta) , oltre a dover dedicare del tempo a pubblicare qui e ricercare la verità su Internet.
Spero che stiano semplicemente rigurgitando con ignoranza qualcosa che hanno sentito o letto da più di un decennio fa e che non conoscono meglio. Prenderei qualsiasi altra cosa che dicono anche come sospetta, questo dovrebbe essere un errore ben noto da chiunque si tenga aggiornato in entrambi i modi.
Tutto è un oggetto (tranne primitives
)
Tutto tranne i primitivi ( int, long, double
, ecc.) Sono oggetti in Java. Non è possibile evitare la creazione di oggetti in Java.
La creazione di oggetti in Java grazie alle sue strategie di allocazione della memoria è più veloce di C ++ nella maggior parte dei casi e per tutti gli scopi pratici rispetto a qualsiasi altra cosa nella JVM può essere considerata "libera" .
Già alla fine degli anni 2000, le implementazioni JVM avevano un certo sovraccarico di prestazioni nell'attuale allocazione degli oggetti. Questo non è stato il caso almeno dal 2005.
Se ci si sintonizza -Xms
per supportare tutta la memoria necessaria per il corretto funzionamento dell'applicazione, il GC potrebbe non dover mai eseguire e spazzare la maggior parte della spazzatura nelle moderne implementazioni del GC, i programmi di breve durata potrebbero non GC affatto.
Non cerca di massimizzare lo spazio libero, che è comunque un'aringa rossa, massimizza le prestazioni del runtime. Se ciò significa che l'heap JVM è allocato quasi sempre al 100%, così sia. La memoria heap gratuita di JVM non ti dà comunque niente di tutto ciò che stai seduto lì.
C'è un malinteso sul fatto che il GC libererà la memoria sul resto del sistema in modo utile, questo è completamente falso!
L'heap JVM non cresce e si restringe in modo che il resto del sistema sia influenzato positivamente dalla memoria libera nell'heap JVM . -Xms
alloca TUTTO ciò che viene specificato all'avvio e la sua euristica è di non rilasciare mai realmente tutta quella memoria al sistema operativo per condividerla con qualsiasi altro processo del sistema operativo fino a quando quell'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 determinato momento. Esistono alcune impostazioni che consentono il rilascio delle percentuali della memoria dell'heap, ma per tutti gli scopi pratici la JVM non è mai in grado di rilasciare abbastanza memoria per consentire che ciò avvengaquindi nessun altro processo può recuperare questa memoria, quindi il resto del sistema non beneficia neppure dell'heap JVM. Una RFE per questo è stata "accettata" il 29-NOV-2006, ma non è mai stato fatto nulla al riguardo. Questo comportamento non è considerato una preoccupazione da nessuno di autorità.
C'è un malinteso sul fatto che la creazione di molti piccoli oggetti di breve durata causa la sospensione della JVM per lunghi periodi di tempo, anche questo è falso.
Gli attuali algoritmi GC sono effettivamente ottimizzati per la creazione di molti piccoli oggetti di breve durata, che in pratica è l'euristica del 99% per gli oggetti Java in ogni programma. I tentativi di raggruppamento di oggetti in realtà peggioreranno le prestazioni della JVM nella maggior parte dei casi.
Gli unici oggetti che devono essere raggruppati oggi sono Oggetti che fanno riferimento a risorse limitate esterne alla JVM; Socket, file, connessioni al database, ecc. E possono essere riutilizzati. Gli oggetti regolari non possono essere raggruppati nello stesso senso delle lingue che consentono l'accesso diretto alle posizioni di memoria. La memorizzazione nella cache degli oggetti è un concetto diverso e può o meno essere ciò che alcune persone ingenuamente chiamano pool , i due concetti non sono la stessa cosa e non dovrebbero essere confusi.
I moderni algoritmi GC non hanno questo problema perché non si allocano secondo una pianificazione, ma si allocano quando è necessaria memoria libera in una determinata generazione. Se l'heap è abbastanza grande, allora non si verificano deallocazioni abbastanza a lungo da causare pause.
I linguaggi dinamici orientati agli oggetti battono C anche adesso nei test sensibili al calcolo.