На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Profi, juice
  
> WebService & нестабильный "Out of Memory" при получении большого XML в ответ.
    Есть устройство, на WM 6.1 Classic. Есть еще одно устройство на WM 5.0. На них есть клиент, на .net cf 3.5. Этот клиент синхронизируется с сервером. На сервере WebService отдает данные, около 2MB.

    Периодически, на клиенте с WM6.1 возникает OutOfMemory примерно на 4-7 раз, а на клиенте с WM5.0 достаточно долго не возникает, но тоже есть.

    Метод веб-сервиса:
    ExpandedWrap disabled
              [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 из логов:
    ExpandedWrap disabled
      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 объекты не... ээээ... перемещаются, что бы устранить фрагментацию, то память потихоньку утекает и в итоге заканчивается.

    Это единственное объяснение, которое я смог придумать.

    Может кто чего получше посоветует?

    Как ловить утечку (если это вообще она) на устройстве че-то вообще даже представить себе не могу... на эмуляторе вроде пока воспроизвести не удалось... хотя и как на нем ловить тоже не представляю.

    Че делать то??? :)
    // Когда у оппонента кончаются аргументы, он начинает уточнять национальность.
      Цитата Felan @
      Че делать то??? :)


      Чего-чего... Уменьшать размер сплошных кусков, требуемых для обслуги ответа веб-сервиса. Если есть такая возможность, конечно.
      Если код и/или протокол веб-сервиса менять нельзя, то можно попробовать поднять внешний прокси-сервис, который бы получал весь длинный XML от исходного сервиса, а мобильный клиент будет вытягивать данные on demand, по кусочку, в lazy-стиле. Цель - максимально избегать попадания в Large Heap, ибо с фрагментацией Вы уже столкнулись.

      P.S. Кстати, а на компакт-версии фреймворка есть IDisposable?
      Windows as usual - my "wau" Windows experience
        Ну как бы это понятно. Хотелось официального подтверждения из документации о догадке про LOH. Во-первых. Во-вторых, я надеялся, что можно как-то настройками что-нибудь поправить.

        Цитата Mr.Delphist @
        P.S. Кстати, а на компакт-версии фреймворка есть IDisposable?

        Есть.
        // Когда у оппонента кончаются аргументы, он начинает уточнять национальность.
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script Execution time: 0,0645 ]   [ 15 queries used ]   [ Generated: 5.07.20, 23:39 GMT ]