• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Weasel

[VB.NET 200x] Reduzi memoria usada pela aplicação

3 mensagens neste tópico

Pessoal tropecei neste code por acaso, será que é mesmo assim ? Não faz mal a nada (nem á propria aplicação) ?

Eu testei e realmente reduz, passou de 9.064K para 3000 e poucos, mas será que se pode usar assim á boa ?

Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents Label1 As System.Windows.Forms.Label
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Button1 = New System.Windows.Forms.Button
        Me.Label1 = New System.Windows.Forms.Label
        Me.SuspendLayout()
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(64, 184)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(192, 40)
        Me.Button1.TabIndex = 0
        Me.Button1.Text = "Reduzir memória usada"
        '
        'Label1
        '
        Me.Label1.Location = New System.Drawing.Point(40, 24)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(232, 120)
        Me.Label1.TabIndex = 1
        Me.Label1.Text = "Este prog mostra como reduzir a quantidade de memória usada por um prog .NET. Par" & _
        "a começar veja a memória actualmente usada por este prog e em seguida carregue n" & _
        "o botão."
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(292, 266)
        Me.Controls.Add(Me.Label1)
        Me.Controls.Add(Me.Button1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Private Declare Auto Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal procHandle As IntPtr, ByVal min As Int32, ByVal max As Int32) As Boolean

    Public Sub SetProcessWorkingSetSizeEx()
        Dim mProc As Process
        mProc = Process.GetCurrentProcess()

        ' Imported function call
        SetProcessWorkingSetSize(mProc.Handle, -1, -1)

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SetProcessWorkingSetSizeEx()
        MsgBox("Veja a memória usada agora!")
    End Sub
End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Até que enfim um topico interessante :P

Diferente de post's banais e repetitivos...

Quanto à tua questão :

1- Os sistemas operativos modernos usam memoria virtual. Isto quer dizer que "não" existe o conceito de memoria RAM livre, o software apenas memoria virtual.

Numa operação normal de alocar memoria o procedimento do S.O. é mover dados do disco para a RAM (caso ainda não se encontrem lá).

2-O que o SetProcessWorkingSetSize basicamente faz é forçar o dump de  toda a memoria RAM (possivel)  do processo em questão para o disco :P. existem contrapartidas nesta abordagem... imagina que a tua aplicação utiliza muitos recursos em memoria, se usares o SetProcessWorkingSetSize faz com que tudo que não esteja a ser usado seja manda-do para o paged system (Virtual memory). O reverso da medalha é quando necessitares de dados que estavam na memoria (RAM) e foram dumped para o filesystem... o S.O. tem que os carregar novamente e colocar na RAM.

Conclusão:

Sera melhor não forçares um uso não muito bem dilineado de como funciona a gestão de memoria virtual do Windows e deixares isso para o S.O.  Se reparares e não fazendo o uso do SetProcessWorkingSetSize, se minimizares a tua aplicação e depois a maximizares verás que ela decresce no uso de memoria RAM o mesmo nr de bytes que aquele que é reduzido usando o SetProcessWorkingSetSize, a diferença é que o windows e o GC é que fazem essa gestão B)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em vb.net assignar um objecto a nothingnão liberta recursos como acontecia em vb6.

Nem é necessaria chamares .Dispose e deixa Garbage Collection fazer o trabalho dele.

Não te preocupes com a memoria usada é normal ser um valor alto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora