Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    vb.net: programma che occupa troppa memoria

    volevo chiedervi perchè secondo voi questo semplice programma usa 20 megabyte di memoria ram:

    codice:
    Module Module1
        Friend WithEvents nfiIcona As NotifyIcon
        Friend WithEvents ctlTimer As Timer
        Private ProcO() As Process, i As Long
    
        Private Sub Init()
            nfiIcona = New NotifyIcon()
            nfiIcona.Icon = My.Resources.trusted
            nfiIcona.Text = "Outlook Viewer Process"
            ctlTimer = New Timer
            ctlTimer.Interval = 1000
            ctlTimer.Start()
        End Sub
    
        Sub Main()
            AddHandler Application.ApplicationExit, AddressOf OnApplicationExit
            ProcO = Process.GetProcessesByName("Outlook")
            Init()
            nfiIcona.Visible = True
            Application.Run()
        End Sub
    
        Private Sub OnApplicationExit(ByVal sender As Object, ByVal e As System.EventArgs)
            ctlTimer = Nothing
            ProcO = Nothing
            If nfiIcona.Visible = True Then nfiIcona.Visible = False
            nfiIcona = Nothing
        End Sub
    
        Private Sub ctlTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlTimer.Tick
            ProcO = Process.GetProcessesByName("Outlook")
            If ProcO.Length = 0 Then Application.Exit()
            For i = 0 To ProcO.Length - 1
                If ProcO(i).Responding = False Then ProcO(i).Kill()
                ProcO(i).Refresh()
                ProcO(i).Dispose()
            Next
        End Sub
    End Module
    c'è un modo per ridurre l'uso della memoria?
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  2. #2
    Dai un'occhiata a questa discussione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3

    Trovata soluzione memoria vb.net

    ho trovato la soluzione al mio problema:
    codice:
    Public Class Form1
    
    
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            nfiIcona.Icon = My.Resources.trusted
            nfiIcona.Text = "Outlook Viewer Process"
            ctlTimer.Start()
            Me.WindowState = FormWindowState.Minimized
            System.Threading.Thread.Sleep(500)
            Me.Hide()
            nfiIcona.Visible = True
        End Sub
    
        Private Sub ctlTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlTimer.Tick
            Dim ProcO() As Process, i
            ctlTimer.Stop()
            ProcO = Process.GetProcessesByName("Outlook")
            If ProcO.Length = 0 Then
                nfiIcona.Visible = False
                Me.Close()
                Me.Dispose()
                Exit Sub
            End If
            For i = 0 To ProcO.Length - 1
                If ProcO(i).Responding = False Then ProcO(i).Kill()
                ProcO(i).Refresh()
                ProcO(i).Dispose()
            Next
            ProcO = Nothing
            ctlTimer.Start()
        End Sub
    End Class
    in pratica ho creato una form invece di usare la sub main...

    minimizzando la form a icona la memoria ram che occupa il mio programma si riduce a soli 5 mb....
    questo perchè per il garbage collector tutte le applicazioni minimizzate a icona sono inutilizzate.... se poi la massimizzate ancora la memoria rimarrà sempre a 5 mb....
    comunque stò pensando di aggiungere un timer che ogni 10 secondi fa il gc.collect perchè ho notato che, se io eseguo tale istruzione e tengo attiva la mia applicazione per + di 10 minuti, la ram occupata dall'applicazione scende vorticosamente a 1,2 mb...

    saluto tutti
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  4. #4
    sono fuso... avevo cliccato nuovo invece di rispondi a un messaggio creato da me il 4 dicembre....

    sorry
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Personalmente penso che non si debba intervenire con la GC.Collect in quanto il sistema ottimizza l'occupazione di memoria in maniera automatica. Al contrario, una Collect frequente, impegna il sistema e ne riduce le prestazioni.

    La memoria che si vede "occupata" (e poi viene liberata quando viene iconizzata l'applicazione) non lo e' veramente. E' la normale gestione del 'working set' di tutte le applicazioni Windows, che viene restituito al sistema quando necessario.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Ho unito le due discussioni.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    come me lo spieghi?
    Immagini allegate Immagini allegate
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Te l'ho detto ... lo spiego con la normale gestione del 'working set' di Windows.

    Quello che nel Task Manager viene evidenziato nella colonna 'Utilizzo memoria' e' in realta' il valore del 'Working Set' e cioe' delle pagine mappate in memoria e assegnate al processo. Ma le pagine mappate in memoria non corrispondono a memoria effettivamente ed esclusivamente utilizzata dal processo, in quanto possono comprendere delle pagine che fanno riferimento ad elementi condivisi (le varie DLL, compreso il framework), e anche pagine allocate 'in previsione' di un loro utilizzo (determinate con un preciso algoritmo a partire dalle richieste fatte a run time dal processo ...). Quando le pagine condivise (o inutilizzate) non sono necessarie, possono essere "reclamate" dal sistema (come avviene dopo l'iconizzazione della finestra, o anche in base a richieste di altri processi) senza che il processo abbia a soffrirne.

    E' molto piu' indicativa nel Task Manager la colonna 'Dimensione memoria virtuale' (che corrisponde ai 'Private Bytes' del processo) in quanto rappresenta l'effettiva quantita' di dati non condivisibili (appunto 'privati') del processo. Tale quantita' non varia a causa di una iconizzazione ma soltanto in base alla richiesta del processo. Tuttavia, questa memoria puo' essere paginata su disco.

    La gestione della memoria di Windows (a prescindere da .NET) e' particolarmente complessa. Quella di .NET e' basata su algoritmi 'delicati' ma fortemente ottimizzati. Un 'abuso' del GC.Collect non fa altro che introdurre problemi e inefficienze in tale gestione.

  9. #9
    hai ragione

    mi chiedo solo come mai la Microsoft abbia optato su una soluzione così pesante della gestione deilla memoria... non era + logico fare un processo che rimaneva sempre attivo e che verificava ogni progetto scritto in .net?

    avrebbe portato via 30 mb di ram come minimo ma almeno un programma occupava poca memoria ram, e non che ogni processo occupasse 20 mb di ram. io parlo per tutti gli utenti che hanno come massimo 512 mb di ram... se uno apre 3 programmi fatti in .net gli va inn fumo il pc....

    così obbliga la gente a comprarsi le ram o a cambiare pc....
    vabbè che la Microsoft in tutti i suoi programmi fa un uso sconsiderato di memoria ram ma così è davvero troppo.... esempio: io ho a casa un pc da 256 mb(quello dei miei fratelli) che non posso far partire + di 3 programmi sennò va in palla...
    scusate le considerazioni....

    ciao
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  10. #10
    Originariamente inviato da andreaciao_22
    non era + logico fare un processo che rimaneva sempre attivo e che verificava ogni progetto scritto in .net?
    È così, solo che invece di un processo sempre attivo è memoria condivisa tra i vari processi:
    Originariamente inviato da oregon
    in quanto possono comprendere delle pagine che fanno riferimento ad elementi condivisi (le varie DLL, compreso il framework)
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.