2010-08-18 3 views
17

Mi sono sempre chiesto, perché Java richiede di impostare manualmente la dimensione dell'heap? Avevo l'impressione che i programmi scritti in altre lingue assegnassero solo la quantità di memoria necessaria per l'esecuzione del programma fino a quando il sistema operativo non fosse più in grado di allocare.Perché è necessario specificare la dimensione heap Java?

Nel mondo Java è necessario impostare la dimensione heap, stack e permgen. Mentre questo è abbastanza semplice dimenticare di aumentare questi numeri "abbastanza grandi" è il motivo numero 1 che ho visto i server andare giù.

Perché non è possibile dire a Java di far crescere heap/stack/permgen tanto quanto è necessario nel tempo?

risposta

4

La mia interpretazione è che Sun è una società focalizzata sulla vendita di Big Box e a loro piace che gli amministratori di sistema possano fare cose su queste scatole. Esecuzione di un sistema per riempire tutta la memoria è un buon modo per eseguirlo nel terreno e non essere in grado di agire in modo efficiente per ripristinare l'operazione perché non è possibile allocare memoria per creare una shell di login, ad esempio.

4

Penso che la memoria reale del computer sia finita. Quindi, in un certo senso, JVM ti permette di rilevare i memleaks prima che tutta la memoria sia sprecata.
Inoltre, cosa fare se si eseguono più JVM sulla stessa macchina, in questo caso come si consente a ciascuna di queste JVM di crescere "quanto necessario"?

1

Perché la crescita della dimensione heap, stack e permgen dinamicamente farebbe scendere il server in ogni caso. In un mondo del genere, il server alla fine perderebbe tutte le sue risorse.

Inoltre, lo sviluppo della gestione automatica della memoria non era così maturo come lo è oggi. Avere limiti virtuali rende le cose più facili se si selezionano i valori di default sbagliati, ma può rendere la codifica un po 'meno efficiente sul back-end.

Sì, queste sono supposizioni, ma ragionevoli; specialmente quando si considerano le origini di Java/Oak della programmazione del set top box incorporato. Non è come se un sistema embedded avesse una memoria virtuale di swap o disco, quindi perché rendere la JVM agire come se fosse disponibile?

7

tre motivi:

  1. Poiché Java era destinato ad essere un linguaggio per scrivere applicazioni web. Generalmente non si ritiene che sia una buona idea lasciare che un'app Web assorba tutte le risorse della macchina.
  2. Perché Java è garbage collector. Oltre a specificare un limite superiore di memoria, la dimensione dell'heap attiva anche la garbage collection. In sostanza stai dicendo "puoi usare così tanto, ma quando raggiungi quel limite devi mettere ordine".
  3. Esistono molte classi di applicazioni in cui si desidera limitare la quantità di memoria utilizzata dal processo Java, ad es. dove è più importante che altri processi continuino quando c'è memoria insufficiente per entrambi.
  4. Perché è possibile limitare la dimensione dell'heap è una funzione. Se ti piace l'approccio in cui il processo può avere memoria illimitata, (come negli altri linguaggi menzionati), puoi sempre impostare il limite di heap su un valore maggiore di quello che potrebbe acquisire. Se si desidera limitare la dimensione dell'heap, è possibile farlo. Altre lingue hanno solo uno di quei comportamenti possibili, rendendoli meno flessibili.
+2

Hai una fonte per il primo punto? Non ho mai sentito la cosa "java era intesa per scrivere app web" prima (non che io abbia approfondito la storia di java, o ...) – Mike

+2

Santo malcontento.Java proveniva da Oak, il che significava implementare un software di set-top box, come il tipo che si potrebbe avere nei sofisticati sintonizzatori TV via cavo. E per quanto riguarda la raccolta dei dati inutili, i rifiuti vengono raccolti quando l'oggetto non è accessibile e non quando vengono raggiunti i limiti di memoria. –

+0

@Edwin Buck: 'I dati inutili vengono raccolti quando l'oggetto non è accessibile, non quando vengono raggiunti i limiti di memoria 'Vero, ma non sono" immediatamente "GCd. La velocità di esecuzione dipende dalla dimensione dell'heap e può essere estremamente importante per le prestazioni. –