Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.205.56.209] |
|
Сообщ.
#1
,
|
|
|
Есть устройство, на WM 6.1 Classic. Есть еще одно устройство на WM 5.0. На них есть клиент, на .net cf 3.5. Этот клиент синхронизируется с сервером. На сервере WebService отдает данные, около 2MB.
Периодически, на клиенте с WM6.1 возникает OutOfMemory примерно на 4-7 раз, а на клиенте с WM5.0 достаточно долго не возникает, но тоже есть. Метод веб-сервиса: [WebMethod(EnableSession = true)] public FormData GetFormData(int formId, byte[] clientHash) { return Common.GetFormData(Session.SessionID, formId, clientHash); } ... [Serializable] public class FormData { public byte[] HashCode { get; set; } public string DataXml { get; set; } } StackTrace из логов: 05:32:52.000 ERROR <Censored>.Mobile.Communication.Synchronizer :: System.OutOfMemoryException: OutOfMemoryException at System.String.Concat(String[] values) at System.String.Concat(String str0, String str1) at System.Xml.XmlReader.ReadString() at System.Xml.XmlTextReader.ReadString() at System.Xml.Serialization.XmlSerializationReader.DeserializePrimitiveElement(LogicalType deserializeAs, Accessor accessor, Fixup fixup, Object fixupTarget, String identifier, Boolean emptyValue, Boolean nullValue) at System.Xml.Serialization.XmlSerializationReader.deserializeElement(Accessor accessor, Fixup fixup, Object fixupTarget) at System.Xml.Serialization.XmlSerializationReader.DeserializeElementMember(MemberValueCollection members, Object fixupTarget, Hashtable internalState, Boolean& firstElement) at System.Xml.Serialization.XmlSerializationReader.deserializeMembers(MemberValueCollection members, Object fixupTarget) at System.Xml.Serialization.XmlSerializationReader.DeserializeComplexElement(LogicalType deserializeAs, Accessor accessor, Fixup fixup, Object fixupTarget, String identifier, Boolean emptyValue, Boolean nullValue) at System.Xml.Serialization.XmlSerializationReader.deserializeElement(Accessor accessor, Fixup fixup, Object fixupTarget) at System.Xml.Serialization.XmlSerializationReader.DeserializeElementMember(MemberValueCollection members, Object fixupTarget, Hashtable internalState, Boolean& firstElement) at System.Xml.Serialization.XmlSerializationReader.deserializeMembers(MemberValueCollection members, Object fixupTarget) at System.Xml.Serialization.XmlSerializationReader.DeserializeComplexElement(LogicalType deserializeAs, Accessor accessor, Fixup fixup, Object fixupTarget, String identifier, Boolean emptyValue, Boolean nullValue) at System.Xml.Serialization.XmlSerializationReader.deserializeElement(Accessor accessor, Fixup fixup, Object fixupTarget) at System.Xml.Serialization.XmlSerializationReader.DeserializeElementMember(MemberValueCollection members, Object fixupTarget, Hashtable internalState, Boolean& firstElement) at System.Xml.Serialization.XmlSerializationReader.deserializeMembers(MemberValueCollection members, Object fixupTarget) at System.Web.Services.Protocols.SoapMessageParser.execute() at System.Web.Services.Protocols.SoapMessageSerializer.Deserialize(XmlReader reader, SoapHttpClientProtocol client, LogicalSoapMethod soapMethod, Boolean soap12) at System.Web.Services.Protocols.SoapHttpClientProtocol.doInvoke(String methodName, Object[] parameters, WebClientAsyncResult asyncResult) at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) at <Censored>.Mobile.Communication.Forms.FormService.GetFormData(Int32 formId, Byte[] clientHash) at <Censored>.Mobile.Communication.Synchronizer.LoadChanges(FormService service, FormInfo formInfo) at <Censored>.Mobile.Communication.Synchronizer.UpdateDataSet(FormService service, FormsSettings formSettings) at <Censored>.Mobile.Communication.Synchronizer.StartSync() Получается, что OOM происходит когда данные еще даже не получены от веб-сервиса. После рытья инета появились подозрения, что потому, что данных больше чем 85К, получаемая строка, которая сохраняется в поле DataXml, располагается в LOH, а поскольку в LOH объекты не... ээээ... перемещаются, что бы устранить фрагментацию, то память потихоньку утекает и в итоге заканчивается. Это единственное объяснение, которое я смог придумать. Может кто чего получше посоветует? Как ловить утечку (если это вообще она) на устройстве че-то вообще даже представить себе не могу... на эмуляторе вроде пока воспроизвести не удалось... хотя и как на нем ловить тоже не представляю. Че делать то??? |
Сообщ.
#2
,
|
|
|
Цитата Felan @ Че делать то??? Чего-чего... Уменьшать размер сплошных кусков, требуемых для обслуги ответа веб-сервиса. Если есть такая возможность, конечно. Если код и/или протокол веб-сервиса менять нельзя, то можно попробовать поднять внешний прокси-сервис, который бы получал весь длинный XML от исходного сервиса, а мобильный клиент будет вытягивать данные on demand, по кусочку, в lazy-стиле. Цель - максимально избегать попадания в Large Heap, ибо с фрагментацией Вы уже столкнулись. P.S. Кстати, а на компакт-версии фреймворка есть IDisposable? |
Сообщ.
#3
,
|
|
|
Ну как бы это понятно. Хотелось официального подтверждения из документации о догадке про LOH. Во-первых. Во-вторых, я надеялся, что можно как-то настройками что-нибудь поправить.
Цитата Mr.Delphist @ P.S. Кстати, а на компакт-версии фреймворка есть IDisposable? Есть. |