Problem med minnes läckage (Visual Basic)

Permalänk
Medlem

Problem med minnes läckage (Visual Basic)

Hej

Jag håller på och skriver ett litet program i visual studio (visual basic). jag har skapat en egen class som jag kallar Data av vilken jag vill skapa objekt för att sedan länka i en lista.

dvs Jag skapar ett ex antal objekt av typen Data och stoppar in dom i en "Microsoft.VisualBasic.Collection" som jag kallar DataColl, och när jag tycker att listan är lagom lång så tar jag bort ett objekt för varje nytt jag stoppar in.

Men när jag låter programet gå och jag kikar i Windows Task Manager ser jag att programmet tar mer och mer i minne för varje objekt som läggs till, har försökt se till att jag tar bort allt i objektet innan jag tar bort det från DataColl men endå slukar det minn

Här kommer min class Data och ett exempel på hur jag använder det:

Public Class Data Private UARFCN As New List(Of Integer) Private RXlev As New List(Of Integer) Private SCRcode As New List(Of Integer) Private MNC As New List(Of Integer) Private Signature As New List(Of Integer) 'UARFCN + SCRcode 'Private Timestamp As New List(Of DateTime) Private Timestamp As DateTime Private empty_obj As Boolean '===============New Data============================= Public Sub Add(ByVal uarf As Integer, ByVal _mnc As Integer, ByVal SCR As Integer, ByVal rx As Integer) UARFCN.Add(uarf) MNC.Add(_mnc) SCRcode.Add(SCR) RXlev.Add(rx) 'Timestamp.Add(time) Signature.Add(uarf + SCR) empty_obj = False End Sub Public Sub AddTime(ByVal time As DateTime) Timestamp = time End Sub Public Sub ObjectEmpty(ByVal var As Boolean) empty_obj = var End Sub '===============Return functions===================== Public Function GetSignature(ByVal i) Return Signature(i) End Function Public Function GetSCRcode(ByVal i) Return SCRcode(i) End Function Public Function GetUARFCN(ByVal i) Return UARFCN(i) End Function Public Function GetMNC(ByVal i) Return MNC(i) End Function Public Function SCRcodeExist(ByVal SCR) Return SCRcode.Contains(SCR) End Function Public Function UARFCNexist(ByVal uarf) Return UARFCN.Contains(uarf) End Function Public Function Signatureexist(ByVal sig) Return Signature.Contains(sig) End Function Public Function GetRXlev_from_signature(ByVal sig) If Signature.Contains(sig) Then Return RXlev(Signature.IndexOf(sig)) Else Return -115 End If End Function Public Function GetNumberOfDataPoints() Return Signature.Count End Function Public Function Empty() Return empty_obj End Function '===============Clean up======================== Public Sub Clear() UARFCN.Clear() RXlev.Clear() SCRcode.Clear() MNC.Clear() Signature.Clear() End Sub End Class

Sedan lägger jag till och tar bort objekt på följande sätt,

Public DataColl As New Microsoft.VisualBasic.Collection() ==========En bit ur den funktion som hanterar datan======== Dim temp_data As New Data If DataColl.Count = 20 Then DataColl.Item(20).Clear() DataColl.Remove(20) DataColl.Add(temp_Data, , 1) 'Lägger till det temporära objektet först i listan Else DataColl.Add(temp_Data, , 1) End If =====================================

Om någon kan se något uppenbart fel säg gärna till, har försök leta runt på nätet men inte hittat något

Tack på förhand

Niklas

orsaken till felet hittad, dock ingen aning om hur det ska lösas :/
Permalänk
Medlem

Jag har ingen koll på Visual Basic eller dess APIs, men jag kan i alla fall inte se någon läcka. Min gissning är att garbage collection är "problemet".

Som du kanske vet kör Visual Basic med en garbage collector för att rensa upp minnet. I allmänhet gäller att en effektiv garbage collector inte frigör minne direkt det slutar användas. Istället går upprensaren regelbundet igenom listor över allokerade minnesutrymmen, och ser vilka som saknar referenser till sig. Av effektivitetsskäl besöks vissa listor oftare än andra, nämligen de som är mer sannolika att ha minne som kan frigöras.

Tanken är att det ofta är bättre att lämna lite mer minne ofrigjort än att slösa CPU-tid på att leta efter och frigöra det. Överstiger minnesanvändningen en viss gräns (som brukar gå att ställa in) kommer collectorn ändå att öka hur mycket den rensar.

En fråga är dock om någon annan del av systemet håller referenser till din data. I så fall kommer den inte att rensas även om du tar bort den från DataColl.

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem

Har inte jätte bra koll på visual basic själv men som tur är finns det massa duktigt folk man kan fråga om hjälp här på sweclockers

Okej, jag har försök och hitta referenser till objektet utöver de jag använder när jag lägger till och tar bort, men kunde inte hitta några så det borde inte vara problemet, och rätta mig om jag har fel men om jag skapar ett nytt objekt i funktionen och lägger det i en lisat, sedan kommer tillbaka till funktionen så har alla referenser till objektet i funktionen försvunnit, dvs

public function min_funktion() Dim temp_data As New Data If DataColl.Count = 20 Then DataColl.Item(20).Clear() DataColl.Remove(20) DataColl.Add(temp_Data, , 1) 'Lägger till det temporära objektet först i listan Else DataColl.Add(temp_Data, , 1) End If end function

om jag ropar på funktione flera gånger så kommer väll inte temp_data hålla kvar referensen till objektet, den förstörs väll när man lämnar funktionen?

och om det är så att programet växer stadigt i minne under tio minuter är det väll inte för att garbage collector väntar med att rensa upp eller kan det gå så långt imellan?

Permalänk
Medlem
Skrivet av niklu147:

public function min_funktion() Dim temp_data As New Data If DataColl.Count = 20 Then DataColl.Item(20).Clear() DataColl.Remove(20) DataColl.Add(temp_Data, , 1) 'Lägger till det temporära objektet först i listan Else DataColl.Add(temp_Data, , 1) End If end function

om jag ropar på funktione flera gånger så kommer väll inte temp_data hålla kvar referensen till objektet, den förstörs väll när man lämnar funktionen?

Det stämmer. temp_data existerar inte efter att funktionen returnerat, och är därför inte längre en referens till något.

Skrivet av niklu147:

och om det är så att programet växer stadigt i minne under tio minuter är det väll inte för att garbage collector väntar med att rensa upp eller kan det gå så långt imellan?

Det är inte omöjligt att det kan ta så lång tid. Enligt Fundamentals of Garbage Collection verkar det inte finnas någon speciell tidsgräns, utan det är bara minnesanvändningen som avgör när den automatiska upprensningen sker.

En sak du kan prova för att se om minne frigörs är att anropa GC.Collect() varje gång du tar bort ett element. Slutar minnesanvändningen öka efter 20 element har du troligtvis ingen läcka. Detta är dock inget du borde göra annat än i testsyfte.

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem

Okej tack så mycket, ska undersöka saken vidare.
Förhoppningsvis är det bara något sånt

Permalänk
Medlem

Konstigt som f**

Jag testade att göra GC.Collect() men det hjälpte inte så jag började rota runt lite mer och hittade vartifrån det kommer men stötte samtidigt på en annan intressant/konstig sak.

Det visa sig att det inte är min lista med objekt som tar så mycket minne utan den här kodraden är orsaken:

_serialPort.WriteLine("text")

Det visa sig också att det här kommandot drar 50% utav processor kapasiteten :/ vilket jag trodde var alla itterationer i mina data listor men tydligen inte, det har alltså varit kommunikationen över serieporten som har varit problemet hela tiden. har provat det jag kan nu utan resultat

här är ett exempel på hur jag använder kommandot:

Public Sub Min_subrutin 'Sets the attributes of the port communication _serialPort.BaudRate = 115200 _serialPort.Parity = O.Ports.Parity.None _serialPort.StopBits = IO.Ports.StopBits.One _serialPort.DataBits = 8 _serialPort.ReadTimeout = 500 _serialPort.WriteTimeout = 500 'open port _serialPort.PortName = "COM5" _serialPort.Open() While True Threading.Thread.Sleep(3000) _serialPort.WriteLine("ett kommando") End While End Sub

Är den något jag missar, måste man rensa upp nån stans mellan varje gång man skickar kommandon eller så?
det känns otroligt skummt iallafall, det fungerar, jag får svar från mottagaren men minnet för mitt program bara ökar och ökar samt att processorn får jobba som en galning.

Tack på förhand
Niklas