Questa è una domanda molto fastidiosa, e credo che contribuisca a molti si oppongono a Java, nonostante sia utile di una lingua.
Il fatto che non ci si possa fidare di "System.gc" per fare qualsiasi cosa è incredibilmente scoraggiante e può facilmente invocare "Paura, Incertezza, Dubbio" nella lingua.
In molti casi, è bello avere a che fare con picchi di memoria causati intenzionalmente prima che si verifichi un evento importante, il che indurrebbe gli utenti a pensare che il programma sia mal progettato / non risponde.
Avere la capacità di controllare la garbage collection sarebbe un ottimo strumento educativo, a sua volta migliorare la comprensione delle persone su come funziona la garbage collection e su come far sì che i programmi sfruttino il comportamento predefinito e il comportamento controllato.
Vorrei rivedere gli argomenti di questo thread.
- È inefficiente:
Spesso, il programma potrebbe non fare nulla e sai che non sta facendo nulla a causa del modo in cui è stato progettato. Ad esempio, potrebbe fare una sorta di lunga attesa con una grande finestra di messaggio di attesa e alla fine potrebbe anche aggiungere una chiamata per raccogliere la spazzatura perché il tempo per eseguirla impiegherà una frazione molto piccola del tempo del lunga attesa ma eviterà che gc agisca nel bel mezzo di un'operazione più importante.
- È sempre una cattiva pratica e indica un codice non funzionante.
Non sono d'accordo, non importa quale spazzatura hai. Il suo compito è rintracciare i rifiuti e pulirli.
Chiamando gc nei momenti in cui l'utilizzo è meno critico, si riducono le probabilità che funzioni quando la propria vita si basa sul codice specifico in esecuzione ma invece decide di raccogliere spazzatura.
Certo, potrebbe non comportarsi nel modo desiderato o previsto, ma quando si desidera chiamarlo, si sa che non sta succedendo nulla e l'utente è disposto a tollerare la lentezza / i tempi di inattività. Se System.gc funziona, fantastico! In caso contrario, almeno ci hai provato. Semplicemente non c'è alcun lato negativo a meno che il Garbage Collector non abbia effetti collaterali intrinseci che fanno qualcosa di orribilmente inaspettato a come si suppone che un Garbage Collector si comporti se invocato manualmente, e questo da solo provoca sfiducia.
- Non è un caso d'uso comune:
È un caso d'uso che non può essere ottenuto in modo affidabile, ma potrebbe esserlo se il sistema fosse progettato in questo modo. È come fare un semaforo e farlo in modo che alcuni / tutti i pulsanti dei semafori non facciano nulla, ti fa chiedere perché il pulsante è lì per cominciare, javascript non ha la funzione di garbage collection quindi noi non esaminalo tanto per quello.
- La specifica dice che System.gc () è un suggerimento che GC dovrebbe essere eseguito e la VM è libera di ignorarlo.
che cos'è un "suggerimento"? che cos'è "ignora"? un computer non può semplicemente dare suggerimenti o ignorare qualcosa, ci sono percorsi comportamentali rigorosi che possono essere dinamici che sono guidati dall'intento del sistema. Una risposta corretta dovrebbe includere ciò che il Garbage Collector sta effettivamente facendo, a livello di implementazione, che gli impedisce di eseguire la raccolta quando lo si richiede. La funzione è semplicemente no? C'è qualche tipo di condizioni che devo soddisfare? Quali sono queste condizioni?
Allo stato attuale, il GC di Java spesso sembra un mostro di cui non ti fidi. Non sai quando arriverà o verrà, non sai che cosa farà, come lo farà. Posso immaginare che alcuni esperti abbiano una migliore idea di come funziona la loro Garbage Collection in base alle istruzioni, ma la stragrande maggioranza spera semplicemente che "funzioni" e che fidarsi di un algoritmo apparentemente opaco per fare il lavoro per te sia frustrante.
C'è un grande divario tra la lettura di qualcosa o l'insegnamento di qualcosa, e in realtà vedere l'implementazione di esso, le differenze tra i sistemi e essere in grado di giocarci senza dover guardare il codice sorgente. Questo crea fiducia e sentimento di padronanza / comprensione / controllo.
Per riassumere, c'è un problema intrinseco con le risposte "questa funzione potrebbe non fare nulla, e non entrerò nei dettagli come dire quando fa qualcosa e quando non lo fa e perché non lo farà o non lo farà, spesso implica che è semplicemente contro la filosofia tentare di farlo, anche se l'intento alla base è ragionevole ".
Potrebbe essere giusto che Java GC si comporti nel modo in cui lo fa, oppure potrebbe non farlo, ma per capirlo, è difficile seguire veramente in quale direzione andare per ottenere una panoramica completa di ciò di cui puoi fidarti del GC e non farlo, quindi è troppo facile semplicemente diffidare della lingua, perché lo scopo di una lingua è avere un comportamento controllato fino a livello filosofico (è facile per un programmatore, in particolare i novizi, cadere in crisi esistenziali da determinati comportamenti di sistema / lingua) sono in grado di tollerare (e se non ci riesci, semplicemente non userai la lingua fino a quando non devi farlo) e più cose che non puoi controllare senza un motivo noto per cui non puoi controllarle sono intrinsecamente dannose.