Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Garbage Collector e classi
Forum - C# / VB.NET - Garbage Collector e classi

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 0:10
Domenica, 07/06/2009
raga ho assoluto bisogno dei vostri saggi consigli.... ho seri problemi di ram con il server in vb.net... stasera mi ha occupato di nuovo 225 mb di ram con 580 user....

allora

ho la classe user  
Codice sorgente - presumibilmente VB.NET

  1. Public Class user
  2.     'NMDC
  3.     Public ultimomex As String
  4.     Public ultimoconnecttome As Int64
  5.     Public ip As String
  6.     Public nick As String = ""
  7.     Public share As Int64
  8.     Public isop As Boolean
  9.     Public profile As Integer
  10.     Public ultimamyinfo As Int64
  11.     Public ultimosearch As Int64
  12.     Public ultimonicklist As Int64
  13.     Public ultimomexint As Int64
  14.     Public ultimopvt As Int64
  15.     Public ultimopvtachi As String
  16.     Public conteggiomyinfo As Integer
  17.     Public conteggiogetnicklist As Integer
  18.     Public zline As Boolean
  19.     Public usercommand As Boolean
  20.     Public stato As String
  21.     Public inizialistato As String
  22.     Public myinfo As String = ""
  23.     Public altronick As String = ""
  24.     Public avvertimenti As Integer
  25.     Public temp As String = ""
  26.     Public falso As Boolean
  27.     Public sharenascosto As Boolean
  28.     Public loggato As Byte = 0
  29.     Public timecontrol As Int64
  30.     Public fraseparla As String
  31.     Public nicklist As Boolean = False
  32.     Public cambiata As Boolean = False
  33.     Public primavotla As Boolean = True
  34.     Public fallato As Integer
  35.     Public supportotthsearch As Boolean = False
  36.     Public infomandate As Boolean = False
  37.     Public client As System.Net.Sockets.Socket
  38.     Public modalita As Char = "M"
  39.     Public contr As Byte = 0
  40.     Public quit As Byte = 0
  41.     Public nickadc As Byte = 0
  42.     Public ReadBuffer(1024) As Byte
  43.  
  44.     'ADC
  45.     Public adc As Boolean = False
  46.     Public cod As String
  47.     Public id As String
  48.     Public pd As String
  49.     Public slots As Integer
  50.     Public email As String
  51.     Public descr As String
  52.     Public taguser As Integer
  53.     Public tagreg As Integer
  54.     Public tagop As Integer
  55.     Public binf As String
  56.  
  57.     Public Sub finale()
  58.         Me.Finalize()
  59.     End Sub
  60. End Class



bene... ogni user è formato da questa classe quindi 588 classi di queste...
quando un user si disconnette faccio pulizia in questo modo...

Codice sorgente - presumibilmente VB.NET

  1. Public Sub disconnettiuser(ByVal user As user)
  2.         On Error Resume Next
  3.         IMPOSTAZIONI.oplist.Remove(user)
  4.         IMPOSTAZIONI.vero.Remove(user)
  5.         mandaatutti2adc("IQUI" & Chr(32) & user.cod, user)
  6.         If user.nickadc = 0 Then
  7.             If user.isop Then
  8.                 mandaoplistconthread()
  9.             End If
  10.             If user.quit = 0 Then
  11.                 mandaatutti2("$Quit " & user.nick)
  12.             End If
  13.             If user.altronick <> "" Then
  14.                 mandaatutti2("$Quit " & user.altronick)
  15.             End If
  16.         End If
  17.  
  18.         user.client.Close()
  19.         user.cod = ""
  20.         user.id = ""
  21.         user.pd = ""
  22.         user.slots = 0
  23.         user.email = ""
  24.         user.descr = ""
  25.         user.taguser = 0
  26.         user.tagreg = 0
  27.         user.tagop = 0
  28.         user.binf = ""
  29.         user.altronick = ""
  30.         user.avvertimenti = 0
  31.         user.cambiata = False
  32.         user.conteggiogetnicklist = 0
  33.         user.conteggiomyinfo = 0
  34.         user.fallato = 0
  35.         user.falso = False
  36.         user.fraseparla = ""
  37.         user.infomandate = False
  38.         user.inizialistato = ""
  39.         user.ip = ""
  40.         user.isop = False
  41.         user.loggato = False
  42.         user.myinfo = ""
  43.         user.nick = ""
  44.         user.nicklist = False
  45.         user.primavotla = False
  46.         user.profile = 0
  47.         user.share = 0
  48.         user.sharenascosto = False
  49.         user.stato = ""
  50.         user.supportotthsearch = False
  51.         user.temp = ""
  52.         user.timecontrol = 0
  53.         user.ultimamyinfo = 0
  54.         user.ultimoconnecttome = 0
  55.         user.ultimomex = ""
  56.         user.ultimomexint = 0
  57.         user.ultimonicklist = 0
  58.         user.ultimopvt = 0
  59.         user.ultimopvtachi = ""
  60.         user.ultimosearch = 0
  61.         user.usercommand = False
  62.         user.zline = False
  63.         user.modalita = ""
  64.         user.adc = False
  65.         user.quit = 0
  66.         user.ReadBuffer = Nothing
  67.         user.finale()
  68.     End Sub



non riesco a capire perche dopo 24 25 ore la ram mi sale a 200 mb... dove è che sbaglio? perche il garbage non mi leva dai piedi gli oggetti che il programma non usa piu??

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 10:31
Domenica, 07/06/2009
Impostare a 0 gli elementi numerici, non serve assolutamente a nulla.

E poi stai operando su una "copia" di user (dato che la ottieni con una ByVal) e non sull'originale ...

Inoltre bisognerebbe avere una visione completa del programma, non solo questa funzione.

PM Quote
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 10:52
Domenica, 07/06/2009
eh tutto non posso proprio... appartre che sono piu di 16.000 righe di codice.... ma poi è un progetto personale... cmq.... dici se io metto byref al posto di byval dovrei migliorare la situazione?

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 11:33
Domenica, 07/06/2009
Io non voglio assolutamente sorbirmi le 16000 righe del tuo programma (anche se il numero non vuol dire molto ... ad esempio, io eliminerei dal conteggio tutte le righe in cui imposti i membri della classe a 0 prima di eliminare l'istanza in quanto inutili ...).

Ti dico solo che se hai un problema (per cui ti sei rivolto ad un forum pubblico) non puoi pretendere di averlo risolto mostrando solo quello che ti pare, perche' il problema potrebbe (soprattutto il tuo tipo di problema) risiedere ovunque e quindi bisognerebbe rivedere tutto il programma.

Per la byref, non credere che sia "risolutiva" del tuo problema ... e' solo un "indicatore" del fatto che il tuo programma potrebbe presentare parecchi "difetti" di progettazione che, "globalmente", portano a inefficiente gestione della memoria se non (addirittura) a memory leask .... ma non lo potremo sapere mai.

PM Quote
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 13:35
Domenica, 07/06/2009
bhe ora che mi ci fai pensare.... potrebbe essere che sale molto la ram perche il programma è pieno di byval che fanno centinaia di copie delle variabili? se metto byref al posto dei byval dove servono... forse risolvo.....

PM Quote
Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 15:17
Domenica, 07/06/2009
una variabile passata per valore viene comunque distrutta al termite della routine; passare i dati per riferimento permette maggiori performance, stai attento però che questo sistema aumenta la probabilità di bug, controlla che le variabili ricevute per riferimento non subiscano variazioni perchè altrimenti queste hanno effetto anche sulla variabile originale (a meno che questo non sia lo scopo).

comuque per distruggere un oggetto c'è il metodo Dispose().

secondo me il problema sta nel fatto che i metodi di servizio dei vari client non vengono distrutti dopo che il client si è disconnesso, prova a guardare con il debugger sull'IDE la quantità di thread attivi presenti

PM Quote
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 16:12
Domenica, 07/06/2009
quando parte sono 18... dopo gia 8-9 ore diventano 20....poi 21.......
e 22 è finita la ram e devo riavviarlo

PM Quote
Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 18:57
Domenica, 07/06/2009
questo significa che hai avuto 22 client che si sono connessi fino a quel momento o che hai 22 client connessi in quel momento?

PM Quote
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 20:02
Domenica, 07/06/2009
abbiamo un'idea diversa di thread.....
il thread è un processo a se stante dentro un altro processo...
ogni client ha il suo processo ma è eseguito in background non in un thread a se stante altrimenti sarebbe troppo pesante da gestire

PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo