What can β€œpin” an object into memory in Silverlight?

I am working on debugging an application that seems to be losing memory like crazy; most of them are apparently related to fragmentation from pinned objects (uploaded image data in WriteableBitmap). However, I am not intentionally using GC.Handle or something like that. All I do is store the data in a MemoryStream and reference it like that.

What operations write data to memory that clearly does not talk about it? Also, how can I find that pinned it with WinDbg?

EDIT:. For the query here, the (slightly sanitized) output of one of G! Root in the System.Int32 array adjacent to a large block of free memory. This reflects all the big free blocks.

EDIT 2: After spending time with my new WinDbg and SOS friends, I found that the WriteableBitmaps AND MemoryStream objects are both β€œpinned” and should be carefully allocated to prevent memory fragmentation. Read the article from the accepted answer to find out why this is necessary.

 DOMAIN(1AC72358):HANDLE(Pinned):72c12f8:Root: 174c5e20(System.Object[])-> 16533060(Project.ProjectParts.PartContainer)-> 167fe554(Project.ProjectParts.Part.PartActivity)-> 167d21d8(Project.ProjectParts.Sprites.Graphic)-> 16770f28(System.Windows.Controls.Canvas)-> 16770e1c(System.Windows.Controls.Canvas)-> 16770ee4(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])-> 1680e778(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])-> 16770f9c(System.Windows.Controls.Canvas)-> 16819114(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])-> 16819160(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])-> 16818df4(System.Windows.Controls.Canvas)-> 16818e58(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])-> 16819f10(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])-> 168194c4(System.Windows.Controls.Canvas)-> 16819528(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])-> 16819574(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])-> 16819370(System.Windows.Controls.Image)-> 21c82138(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])-> 21c82184(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])-> 168195dc(System.Windows.Media.Imaging.WriteableBitmap)-> 21c7ce2c(System.Int32[]) DOMAIN(1AC72358):HANDLE(AsyncPinned):72c1dfc:Root: 166bae48(System.Threading.OverlappedData)-> 1654d448(System.Threading.IOCompletionCallback)-> 1654c29c(System.Net.Sockets.SocketAsyncEventArgs)-> 1654bad4(System.Net.Sockets.Socket+StaticConnectAsyncState)-> 1654ba40(System.Net.Sockets.SocketAsyncEventArgs)-> 1654b684(System.ServiceModel.Channels.SocketConnectionInitiator+ConnectAsyncResult)-> 1654b414(System.ServiceModel.Channels.ConnectionPoolHelper+EstablishConnectionAsyncResult)-> 1654b3b0(System.ServiceModel.Channels.ClientFramingDuplexSessionChannel+OpenAsyncResult)-> 1654b380(System.ServiceModel.Channels.CommunicationObject+OpenAsyncResult)-> 1654b330(System.ServiceModel.Channels.CommunicationObject+OpenAsyncResult)-> 1654b0f4(System.ServiceModel.Channels.ServiceChannel+SendAsyncResult)-> 1654b070(System.ServiceModel.ClientBase`1+AsyncOperationContext[[Cassandra.Common.WCF.IAsyncWcfRequestProcessor, Cassandra.Common.Silverlight]])-> 1654b05c(System.ComponentModel.AsyncOperation)-> 1654b04c(Project.Common.IoC.InvokeAsyncCompletedEventRequestsArgs)-> 1654afec(System.Action`1[[Project.Common.IoC.ProcessRequestsAsyncCompletedArgsEx, Project.Common.SL]])-> 1654afc8(Project.Common.IoC.AsyncRequestDispatcherEx+<>c__DisplayClass1)-> 1654afa0(Project.Common.IoC.NetResponseReceiver)-> 1653408c(System.Action`2[[Cassandra.Common.ExceptionInfo, Cassandra.Common.Silverlight],[Cassandra.Common.ExceptionType, Cassandra.Common.Silverlight]])-> 16533ffc(Project.ProjectParts.ILE.Services.EngineProxyService+<>c__DisplayClass5)-> 16533fdc(System.Action`1[[Cassandra.Common.ReceivedResponses, Cassandra.Common.Silverlight]])-> 16533fbc(Project.ProjectParts.ILE.Services.IEngineProxyExtensions+<>c__DisplayClass1`2[[Project.Services.RequestsAndResponses.ListMediaServersByTokenRequest, Project.Services.RequestsAndResponses.Silverlight],[Project.Services.RequestsAndResponses.ListInstitutionMediaServersResponse, Project.Services.RequestsAndResponses.Silverlight]])-> 16533f9c(System.Action`1[[Project.Services.RequestsAndResponses.ListInstitutionMediaServersResponse, Project.Services.RequestsAndResponses.Silverlight]])-> 1650a2a0(Project.ProjectParts.ILE.MainPage)-> 1674ea0c(Project.ProjectParts.ActivityTimer)-> 165330a4(Project.ProjectParts.PauseManager)-> 165330bc(System.Collections.Generic.List`1[[Project.ProjectParts.IPausable, ActivityFramework]])-> 166a8610(System.Object[])-> 167ca858(Project.ProjectParts.ActivityTimer)-> 167ca838(Project.ProjectParts.ActivityTimerEventHandler)-> 16533060(Project.ProjectParts.PartContainer)-> 167fe554(Project.ProjectParts.Part.PartActivity)-> 167d21d8(Project.ProjectParts.Sprites.Graphic)-> 16770f28(System.Windows.Controls.Canvas)-> 16770e1c(System.Windows.Controls.Canvas)-> 16770ee4(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])-> 1680e778(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])-> 16770f9c(System.Windows.Controls.Canvas)-> 16819114(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])-> 16819160(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])-> 16818df4(System.Windows.Controls.Canvas)-> 16818e58(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])-> 16819f10(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])-> 168194c4(System.Windows.Controls.Canvas)-> 16819528(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])-> 16819574(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])-> 16819370(System.Windows.Controls.Image)-> 21c82138(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])-> 21c82184(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])-> 168195dc(System.Windows.Media.Imaging.WriteableBitmap)-> 21c7ce2c(System.Int32[]) DOMAIN(1AC72358):HANDLE(Pinned):72c2b18:Root: 21c7ce2c(System.Int32[]) 
+7
source share
2 answers

Assuming silverlight works just like a full .net infrastructure, an object larger than 85 KB will almost never be garbage collected. http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

We split our large queue objects into an array of smaller queues, which then allowed us to collect the data structure when it was reduced to its normal working size. Before this code changes, as soon as the queue goes beyond the threshold, the memory will never be released back to the OS.

Could this be what you are experiencing?

+1
source

Pin is a mechanism for holding Async or handlers in your controls so as not to "move in memory" during an operation or reference to a handler.

You should also check to see if you have any Async handlers or operations, such as the WCF client or the open state of the Http Web Service client, before exiting the management model or model or model. If any object is fixed when exiting the control, look at the model or model, you will have a memory leak for them.

Also keep in mind that if this object ends at more than 85,000 bytes, they end up in Generation 2, which is not garbage collected until the application (domain) terminates.

If the object is smaller than 85K and survives the GC for Generation 0. It is promoted to Generation 1, and when it survives or is not released or something keeps it, it will end its life to generation 2, which will not be assembled in SL.

It should also be noted: if you often release / allocate this object, this will lead to memory fragmentation. If your program requires continuous memory space, and there is no free block that is large due to fragmentation, you will get an exception to the memory.

Hope above helps.

0
source

All Articles