2013-04-07 2 views
7

immaginate di avere un'applicazione (unico processo) scritto in C#come posso limitare la dimensione della memoria per il processo .net/mono

Per impostazione predefinita l'applicazione è l'allocazione enorme memoria virtuale, molto più di cui ha bisogno (ad esempio la memoria residente è di circa 10 MB, mentre la memoria virtuale è di diversi GB).

In Java è possibile utilizzare un'opzione per limitare questo con java -mx128m

Come posso fare lo stesso per l'applicazione .net/mono? E la domanda bonus: è possibile applicare/modificare le opzioni GC per mantenere il più basso utilizzo possibile della memoria (raccogliere il prima possibile, non quando il sistema sta esaurendo la memoria)

in pratica il mio obiettivo è quello di creare un'applicazione NET con ingombro memoria minimo

EDIT: per rendere più chiaro inserisco questo scenario, dato che quasi ogni applicazione NET sembra avere un problema simile:

esegue un monodevelop, che è C# applicazione sotto mono - mangia MB di memoria virtuale, mentre utilizza solo 291 MB della memoria residente. Ciò significa che l'applicazione utilizza solo meno di 300 MB di memoria ma ha richiesto 1800 MB per motivi sconosciuti. Questo motivo è ciò che vorrei scoprire e il modo in cui evitarlo.

Probabilmente non è un problema per la maggior parte degli utenti, ma potrebbe essere un problema per le applicazioni in esecuzione su cluster come SGE quando l'attività è limitata dalla memoria virtuale.

+0

Non sarebbe meglio per capire il motivo per cui *** * ** l'applicazione sta allocando così tanta memoria virtuale? Piuttosto che impostare un interruttore che lo affama per la memoria? –

+0

non hai capito la domanda, o forse non l'ho chiesto correttamente. Non si tratta di una determinata applicazione, ma di tutte le applicazioni .net in generale. Java ha questo switch che imposta un limite per la memoria virtuale costringendolo a utilizzare meno memoria possibile. Ciò è utile su cluster avanzati come SGE in cui il compito è limitato dalla memoria virtuale. La mia domanda è se esiste una possibilità simile per .Net in modo che GC entri in situazione quando sta esaurendo la memoria prima di tutto l'intero sistema. – Petr

+0

@CodyGray l'applicazione sta ovviamente allocando tanta memoria perché è naturale per .net, solo come è naturale per qualsiasi altro linguaggio che usa Garbage Collector - non libera la memoria a meno che non abbia bisogno di liberare memoria e alloca molta memoria virtuale, mentre usa solo una piccola memoria residente, semplici applicazioni "Hello world" in java può consumare fino a diversi GB di memoria operativa - dipende dalla configurazione dell'interprete - vedere http://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory -uso – Petr

risposta