Hej, .NET Framework tar en del minne, fast om jag inte minns fel så delas det minnet mellan alla appar som använder .net framework Kika på artikeln http://www.itwriting.com/dotnetmem.php för en beskrivninga av hur du kan uppskatta minnesanvändningen i din applikation.Hög minnesanvändning i egenskapad Windows-tjänst
Jag har skapat en övervakningstjänst i .NET 2.0. Denna loggar lite data från olika performance counters till en MySQL-databas, och den har även referenser till två eventloggar (System och Application) för att hålla koll på två teamade nätverkskort och en RAID-array.
Denna tjänst tar 33 MB internminne. Är detta rimligt?
Jag ska försöka ge lite relevanta kodsnuttar som visar på uppbyggnaden av tjänsten nedan. Hör av er om ni saknar något!
Nedan visas de variabler som används i tjänsten.
<code>
namespace SystemHealthMonitor {
public partial class SystemHealthMonitor : ServiceBase {
private const long tickInterval = 3600000; // once every hour
private string notifyAddresses;
private string raidLogXmlPath;
private Timer watch;
private Database db;
private EventLog systemLog;
private EventLog applicationLog;
</code>
Följande kodsnutt visar OnStart-metoden för tjänsten:
<code>
protected override void OnStart( string[] args ) {
try {
// system log
systemLog.Log = "System";
systemLog.EnableRaisingEvents = true;
systemLog.EntryWritten += new EntryWrittenEventHandler(systemLog_EntryWritten);
// application log
applicationLog.Log = "Application";
applicationLog.EnableRaisingEvents = true;
applicationLog.EntryWritten += new EntryWrittenEventHandler(applicationLog_EntryWritten);
watch.Change(0, tickInterval);
}
catch (Exception ex) {
writeLogEntry(ex);
}
}
</code>
Nästa visar hur funktionen som hämtar en performance counter ser ut (jag hämtar totalt 5 värden):
<code>
private float getCounterValue( string CategoryName, string CounterName, string InstanceName ) {
PerformanceCounter c = new PerformanceCounter(CategoryName, CounterName, InstanceName, true);
c.NextValue();
System.Threading.Thread.Sleep(1000); // delay to allow for new incremental read
float value = c.NextValue();
c.Close();
c.Dispose();
return value;
}
</code>
Databasklassen innehåller endast en connectionString och sedan några metoder för att köra INSERT mot en databas:
<code>
namespace SystemHealthMonitor {
public class Database {
private string connectionString;
</code>
<code>
private void doInsert( MySqlCommand cmd ) {
using (MySqlConnection conn =
new MySqlConnection(connectionString)) {
cmd.Connection = conn;
try {
conn.Open();
}
catch (Exception) {
throw new DatabaseConnectionException();
}
cmd.ExecuteNonQuery();
}
}
</code>
Jag tycker att en tjänst av det här slaget borde ligga runt 3-4 MB i minnesanvändning. 33 MB känns lite mycket... Någon som ser något som är extra minneskrävande, eller har en idé om vad som käkar allt detta minne?
Tack på förhand!Sv: Hög minnesanvändning i egenskapad Windows-tjänst
Sv:Hög minnesanvändning i egenskapad Windows-tjänst
Kolumnen Mem Usage i task manager säger inte så mycket, kolla hellre på Private Bytes för din process i PerfMon.
Men sammantaget så kan man säga att an service skriven i .NET drar betydligt midre minne än en service skriven i C++. Dock så är kostnaden för det extra minnet oftast betydligt lägre än kostnaden för den extra tid som det tar att skriva servicen i C++ istället.
/Andreas