Domanda

Proveniente da uno sfondo Java, una delle cose a cui sono abituato è dire alla JVM quale dovrebbe essere la dimensione massima dell'heap. Se il programma in esecuzione tenta di ingoiare più di quanto è consentito e il Garbage Collector non può liberare più risorse, viene generato OutOfMemoryError e tutto va a gonfie vele. Pertanto l'impostazione della dimensione massima dell'heap è importante in Java.

Questo si applica in .net? Puoi impostare i limiti di dimensione dell'heap? Il CLR continua a far crescere il suo cumulo fino a raggiungere i limiti fisici della macchina? O non è un problema in .net per qualche sottile motivo che i miei paraocchi Java mi impediscono di vedere?

È stato utile?

Soluzione

Non è possibile impostare la dimensione heap massima in .Net a meno che non si ospiti il ??CLR da soli in un processo.

Modifica: Per controllare le allocazioni di memoria di CLR inclusa la dimensione massima dell'heap, è necessario utilizzare l'API di hosting per ospitare il clr e utilizzare in modo specifico le "interfacce di Memory Manager", alcune informazioni di avvio sono disponibili qui MSDN Magazine, colonna CLR Inside Out: API di hosting CLR

Modifica: per rispondere alla tua domanda, perché dovresti voler controllare l'allocazione della memoria o in particolare la dimensione massima dell'heap, di solito non vuoi, ma se stai scrivendo un'applicazione che è come SQL Server o IIS o qualche applicazione in tempo reale, avresti una ragione abbastanza buona per avere il controllo della memoria e in particolare, evitare il paging, altrimenti il ??CLR stesso e il sistema operativo fanno già un buon lavoro per te, e ciò che resta è garantire che l'applicazione utilizzi le risorse minime affinché le cose funzionino correttamente.

Altri suggerimenti

No, non si applica in .NET. L'heap infatti continua a crescere fino a quando non può più crescere. (Ovviamente questo è "dopo aver tentato di recuperare memoria attraverso GC, aumentare l'heap"). Fondamentalmente non c'è quasi la stessa messa a punto disponibile nel .NET GC come in Java. Puoi scegliere il GC del server o quello del client e penso che ci sia un'opzione per accendere / spegnere il GC simultaneo (troverò i collegamenti tra un minuto) ma è praticamente tutto.

EDIT: sembra che ci sia qualcosa in più, anche se non molto. post di blog di Rick Minerich sulle impostazioni GC e il successivo sembra sapere piuttosto più di quanto io faccia riguardo alla questione. Sono probabilmente un buon punto di partenza per qualsiasi ulteriore indagine, ma sono per lo più bandiere piuttosto che il tipo di limiti di memoria disponibili nelle JVM.

EDIT: la risposta di Pop solleva un buon punto - ho assunto un "normale" Modello di hosting CLR (ovvero non sotto il tuo controllo). Se vuoi dedicarti allo sforzo di ospitarlo da solo, avrai probabilmente un controllo molto maggiore - a costo del lavoro extra di hosting. Non posso dire di aver mai guardato in quel lato delle cose.

Potresti voler guardare System.Runtime.MemoryFailPoint .

Per quanto ne ho trovato, non esiste un modo semplice per controlla la dimensione dell'heap di un'app .Net tramite CLR.

Il link sopra solo la metà risponde alla domanda. Quando ho studiato questo stesso problema, la risposta è "L'heap cresce per utilizzare tutta la memoria disponibile" come se fosse l'unico motivo per cui desideri controllare la dimensione massima dell'heap.

Sugli ambienti server (in genere Java), non si desidera che un'app mal funzionante gestisca la memoria a spese di altre app ospitate. Una soluzione semplice è limitare la quantità di memoria che l'app può utilizzare per il suo heap. Ciò si ottiene con l'argomento -Xmx di Java in modo da poter garantire che l'app non utilizzerà più di quanto previsto, ad es. -Xmx256M. Poiché l'allocazione di memoria sull'heap durante l'inizializzazione può rallentare l'avvio delle app, Java utilizza l'argomento -Xms per consentire alle app che eseguono molta creazione di oggetti durante l'inizializzazione di iniziare con un grande blocco di heap anziché JVM ridimensionando continuamente l'heap mentre 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 .dll nativi che equivalgono 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 attraverso l'uso di moduli IIS chiamati Web Apps per cui puoi dire a IIS di limitare la memoria di una determinata app web. Mi chiedo se questo perché IIS ha routine personalizzate che sostituiscono / sovrascrivono new () / malloc () / etc e quindi possono fornire questo tipo di controllo alle app client. Ciò significa che le app .Net autonome sono sfortunate a meno che non si desideri scrivere un gestore di memoria personalizzato in C ++ e creare un'interfaccia per .Net

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top