2009-03-18 28 views

risposta

11

This thread sembra esattamente quello che vuoi.

Se sto leggendo correttamente il post di MVP, su un sistema a 32 bit ci si limita a una dimensione dell'heap di 1,5 GB, non importa cosa, di cui si ottiene tutto non appena viene avviato il processo. Su un sistema a 64 bit il tuo heap è praticamente illimitato, non credo che nessun server mainstream o PC possa contenere la stessa quantità di memoria fisica di un processo a 64 bit.

+1

E se si desidera limitare la dimensione dell'heap a un determinato importo? –

+0

Assicurati di costruire il tuo assembly su x64 o su qualsiasi CPU! Se si costruisce su x86, anche su un SO/hardware x64 si avrà il limite di 1,5 GB. – Despertar

+0

Penso che l'OP sta chiedendo come limitare l'heap di un'applicazione .Net per utilizzare solo 256 MB. Chiede se c'è una variabile argomento/configurazione/ambiente che lo farà, non necessariamente solo aumentando l'heap. –

5

Per quanto ho trovato, non esiste un modo semplice per controllare la dimensione dell'heap di un'app .Net utilizzando il CLR.

Il collegamento nella risposta di @Dave risponde solo a metà alla domanda. Quando ho ricercato questo stesso problema, la risposta è "L'heap cresce per utilizzare tutta la memoria disponibile" come se fosse l'unica ragione per cui si desidera controllare la dimensione massima dell'heap.

In ambienti server (in genere Java), non si desidera un'applicazione mal funzionante per il consumo di memoria a scapito di altre app ospitate. Una soluzione semplice consiste nel limitare la quantità di memoria che l'app può utilizzare per il suo heap. Questo è realizzato con l'argomento -Xmx di Java in modo da poter garantire che l'app non utilizzi più di quanto pianificato, ad es. -Xmx256M. Poiché l'allocazione della memoria sull'heap durante l'inizializzazione può rallentare l'avvio delle app, Java utilizza l'argomento -Xms per consentire alle app che fanno un sacco di creazione di oggetti durante l'inizializzazione di iniziare con un grosso blocco di heap invece della JVM che ridimensiona continuamente l'heap. va.

. Il CLR di Net non ha questa capacità. Sospetto che sia perché. CLR di .Net non è una macchina virtuale. Il CLR sembra essere un'API (abbastanza completa, potrei aggiungere) che funge da adattatore per nativi. Dll che equivale a un approccio molto più simile a un eseguibile quando si tratta di gestione della memoria.

Ho posto questa domanda sullo sviluppo di SharePoint e ho sentito che potrebbe essere possibile controllare l'heapsize tramite l'uso di moduli IIS denominati Web Apps con cui si può dire a IIS di limitare la memoria di una determinata applicazione web. Mi chiedo se questo è perché IIS ha routine personalizzate che sostituiscono/override new()/malloc()/etc e quindi in grado di fornire questo tipo di controllo alle app client. Ciò significa che le app .Net standalone sono sfortunate a meno che non si voglia scrivere un gestore di memoria personalizzato in C++ e creare un'interfaccia per .Net

La linea di fondo è che un programma CLR utilizza qualsiasi criterio di gestione della memoria/controlla l'hosting processo mette in atto. Questo è il motivo per cui devi controllare l'utilizzo della memoria di una pagina Web C# da IIS, perché IIS è in realtà un processo host che fornisce l'ambiente per l'esecuzione del codice CLR.

Problemi correlati