Wie verwaltet VB den Arbeitsspeicher bzgl Variablen?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von bla.

    Wie verwaltet VB den Arbeitsspeicher bzgl Variablen?

    Hallo,

    Mich würde mal interessieren, wie VB Variablen handled.

    Wenn ich global etwas deklariere, ist ja klar, dass diese Variable auch Arbeitsspeicher verbraucht.

    Was ist aber wenn ich in einer Sub eine Variable deklariere?
    Wird die Variable nach Beendigung der Sub geleert oder sollte man das selber machen oder den Garbage Collector nutzen (was macht der eigentlich?)?


    Was ist die beste Variante?

    VB.NET-Quellcode

    1. Private Sub Test
    2. Dim riesigesArray as Double(,) = ...
    3. End Sub


    oder

    VB.NET-Quellcode

    1. Private Sub Test
    2. Dim riesigesArray as Double(,) = ...
    3. riesigesArray = Nothing
    4. End Sub


    oder

    VB.NET-Quellcode

    1. Private Sub Test
    2. Dim riesigesArray as Double(,) = ...
    3. riesigesArray.Dispose
    4. End Sub


    oder

    VB.NET-Quellcode

    1. Private Sub Test
    2. Dim riesigesArray as Double(,) = ...
    3. GarbageCollector.Collect
    4. End Sub
    Für ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln!
    Also das .net framework kümmert sich bei lokalen variablen selbstständig um die entsorgung, sofern es primitive datentypen sind. Wenn du jetz lokal ein socket objekt oder vaiable(wie du es nennst) dann is das ja ein framework typ. Die implementieren selber schon das dispose. Da definierst du am besten das ganze in einem using block, der kümmert sich dann auch selber um das aufräumen

    also bei primitiven datentypen brauchst nix (mehr) disposen/auf nothing setzten. "(mehr)", weil das nur noch in vb6 notwendig war, in .net nicht mehr
    bei selbst geschriebenen oder frameworktypen mit using arneiten oder selber disposen

    lg radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @Radinator Ist aber auch nur notwendig, wenn ​IDisposable im Spiel ist.
    Wenn Du Visual Studio Professional besitzst, kannst Du mit der Codeanalyse entsprechende Stellen aufdecken und mit Disposing rumhantieren.

    btw: Nicht freigegebenes Zeugs fliegt auch irgendwann von selber wieder aus dem RAM, dennoch ist es natürlich wichtig, dass während der Laufzeit ebenso Memory Leaks verhindert werden.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    btw: Nicht freigegebenes Zeugs fliegt auch irgendwann von selber wieder aus dem RAM
    Das mag meist zutreffen, aber nicht immer. ZB wenn ein FilsStream nicht disposed/geschlossen wird, bleibt Datei systemweit gesperrt, und wird erst aufgehoben, wenn das Prog beendet.
    Wie gesagt: gilt so für IDisposable.

    Um alles andere kümmert sich der GC.
    Den Aufruf GC.Collect() soll man vermeiden, weil dieser erzwungene Eingriff bringt den GC-internen Automatismus durcheinander, und verschlechtert letztendlich Performance.
    Auch hier mag es begründete Ausnahmen geben, wenn man sich in besonders schwierigen Situationen garnet anders zu helfen weiß, aber generell: Lass den GC sein Job machen, dann macht er ihn am besten.

    Zu post#1: da brauchst du dich garnet drum zu kümmern. riesigesArray ist eine lokale Variable, und solch verfällt als allererstes der GarbageCollection - bereits nach Ablauf der Methode stehts auf dem GC seine ToDo-Liste, und zwar zuoberst oder zumindest sehr weit oben.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    und wird erst aufgehoben, wenn das Prog beendet.

    Joa, habe ich ja (indirekt) gesagt, dass das erst der Fall ist, wenn Du Deine Anwendung beendest. Deshalb "während der Laufzeit".

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Das nicht, aber halt nicht freigegeben, jo. Wird aber beides so oder so dann vom OS verwaltet, sobald das Programm beendet wird, insofern man natürlich das nicht selber freigibt, was man dennoch natürlich tun sollte. Wenn ein Programm nämlich während der Runtime eine Datei blockiert oder den RAM zumüllt, dann ist das natürlich sehr schlecht und sollte nicht sein, aber das weiß ja jeder, der das schon mal erlebt hat und Dir muss ich das ja denke nicht erzählen. :P

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: