Announcement

Collapse
No announcement yet.

Frage zum Speicherverbrauch einer Anwendung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Frage zum Speicherverbrauch einer Anwendung

    Hallo zusammen,

    also irgendwie verstehe ich das Framework nicht ganz. Ich habe eine Anwendung in der ich diverse Komponeten nutze aber auch eigene Klassen für LogFiles, Database usw. einsetzte. Beim Starten der Anwendung nimmt sich die App gleich mal 44 MB RAM. Ist meiner Meinung nach etwas viel. Jetzt läuft die Anwendung, ohne dass diese etwas tut, und der Speicher wächst (zwar wenig aber er wächst). Wenn ich die Anwendung minimiere, fällt der RAM auf 900 KB. Beim erneuten Anzeigen steigt der Speicher dann wieder auf 9 MB. Jetzt meine Frage. Warum nimmt sich die Anwendung beim erstmaligen start so viel Speicher? Kann man das irgendwie beeinflussen? Denn wenn ich das mal weiterspinne, dann starte ich auf einem Server so 3 Programme, und 150 MB sind schon weg, jetzt läuft da noch eine Oracle und ein WebServer drauf. Wieviel GB Ram braucht man denn dann? Oder habe ich die Philosophie von .NET noch nicht verstanden? Oder nimmt sich eine Anwendung erstmal soviel RAM wie es denkt das es braucht, und wenn mehrere Anwendungen parallel laufen, gibt man sich auch mit weniger RAM zufrieden? Was genau läuft da ab, wenn eine .NET Anwendung startet?

    Gruß

    Sascha

  • #2
    Hallo,
    wenn eine .NET-Anwendung wird, muss diese zur Laufzeit vom JIT-Compiler (Just-In-Time-Compiler) beim jeweils ersten Zugriff von Klassen und Methoden für die aktuell vorgefundene Prozessor-Architektur in CPU-Anweisungen übersetzt (kompiliert) werden. Außerdem müssen alle referenzierten externen Assemblies geladen werden, denn die eigenen .NET-Anwendung besteht ja zum größten Teil aus Aufrufen der Klassenbibliothek vom .NET Framework. Daher ist es normal, dass jede gestartete .NET-Anwendung erst einmal Platz im Working Set (virtueller Arbeitsspeicher) belegt. Allerdings unterscheidet Windows ja zwischen dem virtuellen Speicher und dem realen Speicher (zum Beispiel werden gemeinsam genutzte (statische) Assembly-Teile nur einmal in den physischen RAM geladen).
    <br>
    Für eine .NET-Anwendung ist der Garbage Collector (GC) für das Aufräumen von nicht mehr benötigten Speicher zuständig. Wenn die Anwendung auf einem Multiprozessor-Rechner ausgeführt wird, läuft der GC im Vordergrund auf einer CPU, so dass nicht mehr benötigten Objektinstanzen sofort abgeräumt werden. Ist der Rechner allerdings nur mit einer CPU ausgestattet, läuft der GC in der Voreinstellung im Hintergrund (damit der Anwender für seine Anwendung die maximale Leistung nutzen kann), so dass der verfügbare freie Arbeitsspeicher erst verbraucht wird, bevor der GC seine (CPU-intensive) Arbeit aufnimmt . Wenn man das nicht möchte, kann über die .NET Framework-Konfiguration der GC über den Radiobutton auch für Einprozessor-Rechner in den Vordergrund-Modus geschaltet werden.
    <br>
    Im .NET Framework 2.0 stellt der GC die neuen Methoden <b>AddMemoryPressure</b> und <b>RemoveMemoryPressure</b> zur Verfügung, so dass die eigene .NET-Anwendung die Bewertungs-Kriterien des Speicherverbrauchs in eigener Regie ändern kann. Für eine normale .NET-Anwendung ist das jedoch wohl weniger Sinnvoll, da .NET den Job auch so schon gut macht.
    <br>
    &gt;..eine Oracle und ein WebServer drauf...
    <br>
    Bei einem derartigen Server (Datenbank-Server und Web-Server) sollte man generell zur Mehrprozessor-Hardware greifen, so dass .NET für diesen Einsatzfall bereits in der Voreinstellung perfekt konfiguriert ist

    Comment


    • #3
      Hallo,

      soweit ist es klart, aber ich möchte mein Programm in keinen Installer "packen", sondern das Programm incl. aller nötigen Dateien einfach auf FS - Ebene kopieren und dann von einem Netzlaufwerk aus starten. Dieses Programm soll von mehreren Benutzer gestartet werden können, deswegen benötigen wir das Netzlaufwerk, welches den entsprechenden Usern per Login-Script zugeordnet wird. Ich stelle mir das so vor: Im Programm selber schalte ich die Prüfung der Security temporär (nur zur Laufzeit des Programms aus. geht das?

      Gruß

      Sasch

      Comment


      • #4
        > Im Programm selber schalte ich die Prüfung der Security temporär (nur zur Laufzeit des Programms aus. geht das?

        Wenn das so einfach gehen würde was würden wohl die Viren/Wurmprogramme machen?

        Du mußt schon mindestens als Admin auf Domain-Ebene entsprechende Rechte deinem Programm mitgeben wenn es von einem Netzwerklaufwerk laufen soll. Am besten verwendest Du für deine Programm einen Strong Key (hoffentlich richtiger Name) um damit nur diesem Strong Key einmal auf Domain-Ebene entsprechendes "Vertrauen" auszustellen

        Comment


        • #5
          Hallo,

          und wie könnte ein solches Szenario im Detail aussehen? Klar hast Du mist der Aussage recht, das Viren und Würme dieses System ausnutzen könnten. Aber ich muss gestehen, dass ich zwar das Problem verstehe, aber erheblich Probleme habe, dieses Verfahren im Programm und oder auf Konfigurationsebene zu implementieren.

          Gruß

          Sasch

          Comment

          Working...
          X