SORU
2 HAZİRAN 2011, PERŞEMBE


Çok Yüksek Bellek Kullanımı .NET 4.0

Bir C# Windows geçenlerde taşındı Hizmet .NET 3.5 .NET 4.0. Başka kod değişiklikleri yapıldı.

Belirli bir iş yükü için 3.5, bellek utilzation çalışan bellek ve işlem hacmi yaklaşık 1.5 GB iken 20 saniyede X oldu. (X) bu soru bağlamında önemi yok.)

Aynı hizmet 4.0 üzerinde çalışan arasında bellek 3 GB ve 5 GB kullanır ve daha az 4 saniyede X alır. Aslında, bu hizmet genellikle bellek kullanımını sistemim 99% kullanımı ve sayfa dosyası çılgına döner değiştirmeyi de konuşlanma kadar tırmanmaya devam ederken motoru çalışmadı sona erecek.

Eğer bu çöp toplama ile ilgisi var, ya da ne olduğundan emin değilim, ama sorun onu çözemedim ben. Pencere servis için kullandığı "Server" GC config dosyası üzerinden anahtarı aşağıda:

  <runtime>
    <gcServer enabled="true"/>
  </runtime>

Yanlış için bu seçeneği değiştirmek, bir fark yaratmak için değildi. Ayrıca, büyük değişiklikler iş istasyonu modu, sunucu GC modu GC 4.0, yeni GC üzerinde yaptığım okuma. Bu yüzden belki de GC konu ile ilgisi yok.

Fikirler?

CEVAP
2 HAZİRAN 2011, PERŞEMBE


Peki, bu büyük bir macera oldu.

Kök neden SQL Server Raporlama Hizmetleri davranışını' top bu üzerinde çalışırken sınıf (v2010) LocalReport .bir değişiklik olduğu ortaya çıkıyor NET 4.0.

Temel olarak, Microsoft her zaman bir rapor bu kadar ayrı uygulama etki alanında yapıldı işlendi, böylece RDLC işleme davranışını değiştirmiş. Bu aslında özel bir bellek sızıntısı uygulama alanlarından derlemeler boşaltmak için yetersizlik nedeniyle adres için yapıldı. LocalReport sınıf RDLC dosyasını inceledikten sonra gerçekten hızlı bir derleme oluşturur ve uygulama etki alanına yükler.

İşleme olduğum raporun büyük hacmi nedeniyle benim durumumda, bu Sistemin çok büyük sayılar elde edildi.Çalışma zamanı.Uzak.Serverİdentity nesneler yaratılıyor. Bu bir RLDC uzak gerekli işleme neden olarak kafam karışmıştı olarak neden benim için ipucu oldu.

Tabii ki, başka bir uygulama etki alanında bir sınıf üzerinde bir yöntemi çağırmak için, uzak kullandığınız tam olarak ne olduğunu. .NET 3.5, bu, varsayılan olarak, RDLC-Kurul aynı uygulama yüklendi olarak gerekli değildi etki alanı. .NET 4.0, ancak, yeni bir uygulama etki alanı varsayılan olarak oluşturulur.

Düzeltme oldukça kolay oldu. İlk eski güvenlik politikası aşağıdaki config kullanarak etkinleştirin gitmem gerek

  <runtime>
    <NetFx40_LegacySecurityPolicy enabled="true"/>
  </runtime>

Sonra RDLCs aşağıdaki arayarak benim hizmet olarak aynı uygulama etki alanı içinde işlenmiş olması için zorlamak için ihtiyacım vardı:

myLocalReport.ExecuteReportInCurrentAppDomain(AppDomain.CurrentDomain.Evidence);

Bu sorunu çözüldü.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EEVblog2

    EEVblog2

    2 HAZİRAN 2014
  • nigahiga

    nigahiga

    21 Temmuz 2006
  • vgeller1

    vgeller1

    22 Kasım 2009