2015-10-29 9 views
5

Ho osservato alcuni fenomeni strani in programmazione per un po 'di tempo, dal momento che overcommit è abilitato di default sui sistemi Linux.Perché così tante applicazioni allocano una quantità incredibilmente grande di memoria virtuale mentre non ne usano nessuna?

Mi sembra che praticamente tutte le applicazioni di alto livello (ad esempio l'applicazione scritta in linguaggio di programmazione di alto livello come Java, Python o C# incluse alcune applicazioni desktop scritte in C++ che utilizzano librerie di grandi dimensioni come Qt) utilizzino una quantità folle di memoria operativa virtuale. Ad esempio, è normale che il browser Web assegni 20 GB di RAM mentre utilizza solo 300 MB di esso. O per un ambiente dektop, server mysql, praticamente ogni applicazione java o mono e così via, per allocare decine di gigabyte di RAM.

Perché sta succedendo? Qual è il punto? C'è qualche vantaggio in questo?

Ho notato che quando disattivo overcommit in linux, nel caso di un sistema desktop che esegue in realtà molte di queste applicazioni, il sistema diventa inutilizzabile in quanto non si avvia nemmeno correttamente.

risposta

3

Le lingue che eseguono il codice all'interno di macchine virtuali (come Java (*), C# o Python) in genere assegnano grandi quantità di memoria (virtuale) all'avvio. Parte di questo è necessario per la macchina virtuale stessa, parte viene pre-allocata per inoltrare all'applicazione all'interno della VM..

Con le lingue in esecuzione con controllo OS diretto (come C o C++), questo non è necessario. È possibile scrivere applicazioni che utilizzano in modo dinamico solo la quantità di memoria che effettivamente richiedono. Tuttavia, alcune applicazioni/framework sono ancora progettati in modo tale da richiedere una grande quantità di memoria dal sistema operativo una volta, e quindi gestire la memoria da soli, nella speranza di essere più efficienti rispetto al sistema operativo.

ci sono problemi con questo:

  • Non è necessariamente più veloce. La maggior parte dei sistemi operativi è già abbastanza intelligente su come gestiscono la memoria. La regola numero 1 dell'ottimizzazione, misura, ottimizza, misura.

  • Non tutti i sistemi operativi fanno hanno memoria virtuale. Ci sono alcuni abbastanza capaci là fuori che non possono eseguire applicazioni che sono così "negligenti" nel presupporre che è possibile allocare lotti di memoria "non reale" un sacco di memoria "non reale" senza problemi.

  • Hai già scoperto che se si trasforma il sistema operativo da "generoso" a "rigoroso", questi maiali della memoria cadono sul loro naso. ;-)


(*) Java, per esempio, non può ampliare sua VM una volta che è iniziato.È necessario specificare massimo come parametro (-Xmxn). Pensare "meglio prevenire che curare" porta a gravi sovrallenazioni da parte di determinate persone/applicazioni.

+0

Ok, ma java non viene utilizzato solo su linux. Il overcommit è abilitato su tutti i sistemi operativi in ​​questi giorni? Se non lo è (e dubito che lo sarebbe) come è possibile che questi SO eseguano anche questi programmi, mentre non sembra possibile su Linux con overcommit disabilitato (non potrei letteralmente nemmeno avviare il sistema operativo quando Ho disabilitato l'overcommit, i requisiti di memoria erano enormi). – Petr

+0

@Petr: "Overcommit" - distribuire più memoria virtuale di quanta c'è la memoria fisica - è in effetti l'impostazione predefinita su Windows e Linux. E questo è sufficiente per far sì che molti sviluppatori non si preoccupino veramente del resto del mondo informatico. Uno dei sistemi operativi che non ha "fatto" memoria virtuale è stato, per esempio, Amiga OS 3.x - e anche quello non ha mai "fatto" Java. – DevSolar

1

Queste applicazioni di solito hanno un proprio metodo di gestione della memoria, ottimizzato per il proprio utilizzo ed è più efficiente della gestione della memoria predefinita fornita dal sistema. Quindi allocano un enorme blocco di memoria, per saltare o minimizzare l'effetto della gestione della memoria fornita dal sistema o dalla libc.