0

OutOfMemoryExceptionsを取得するまでメモリ使用量がゆっくりと上昇するプリコンパイルされたWebアプリケーション(32ビット)があります。プロファイラを使用して、主な疑惑がSystem.Web.VirtualPathオブジェクトの文字列であり、System.Web.VirtualPathオブジェクトがSystem.Web.Compilation.BuildManagerオブジェクトの_localResourcesAssembliesハッシュテーブルに格納されていることがわかりました。BuildAPIのWebAPIメモリリーク

これらのエントリは、約50 MBのバッチで追加されたように見えます.4〜6時間に1回です。私は立ち往生しています - 私は、これらのエントリを追加するBuildManagerに呼び出されているものがないのです。エントリを見ると、属性ルーティングされたコントローラの有効なルート(または有効なルートパスの親パス)と一致するパスが含まれます。

アプリケーションのディレクトリでファイルが変更される必要がありません。

似たようなルートを持つ簡単なWebアプリケーションをセットアップして問題を再現できるかどうかを確認しましたが、テストアプリケーションで問題を再現できませんでした。

BuildManager(密閉されたクラス、たぶんシングルトン)オブジェクトの呼び出し方法を知る方法はありますか?

+0

はこれを必要とする、それこの犯人はWebページのASP.NETだと思われる。私たちはヘルプページを持っているだけです...私たちのアプリの残りはWebAPIです。エリア登録をコメントアウトして、それが問題を修正するかどうかを確認します。 – cgroneman

答えて

0

回避方法:Microsoft.AspNet.WebPagesのnugetパッケージ(およびそれに依存するページ、Microsoft.AspNet.WebApi.HelpPageパッケージを含む)を削除します。

私たちは最終的に、問題の真の原因から出てきたメモリ不足のスタックトレースを取得しました(ほとんどのトレースは、一度に数MBを割り当てる独自のコードにあります)。スタックトレースは以下の通りです。

WebPages HTTPモジュールが動的に追加され、すべてのURLパスを追加していたコールバックをBuildManagerのキャッシュに登録することができました.32ビットのメモリスペースと膨大な数のユニークなパスにより、最終的に私たちを記憶から追い出す。

、最終的には問題の原因に私たちを導くことができたスタックトレース約束通り:私はそれを確認することができます前に、私は解決策を持っていることがあります...それ以外の場合は誰に

Exception type: OutOfMemoryException 
Exception message: Exception of type 'System.OutOfMemoryException' was thrown. 
at System.Collections.Hashtable.rehash(Int32 newsize, Boolean forceNewHashCode) 
at System.Collections.Hashtable.expand() 
at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add) 
at System.Collections.Hashtable.set_Item(Object key, Object value) 
at System.Web.Compilation.BuildManager.EnsureFirstTimeDirectoryInit(VirtualPath virtualDir) 
at System.Web.Compilation.BuildManager.GetBuildResultFromCacheInternal(String cacheKey, Boolean keyFromVPP, VirtualPath virtualPath, Int64 hashCode, Boolean ensureIsUpToDate) 
at System.Web.Compilation.BuildManager.GetVPathBuildResultFromCacheInternal(VirtualPath virtualPath, Boolean ensureIsUpToDate) 
at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) 
at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) 
at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound) 
at System.Web.Compilation.BuildManager.GetObjectFactory(String virtualPath, Boolean throwIfNotFound) 
at System.Web.WebPages.BuildManagerWrapper.GetObjectFactory(String virtualPath) 
at System.Web.WebPages.BuildManagerWrapper.ExistsInPrecompiledSite(String virtualPath) 
at System.Web.WebPages.BuildManagerWrapper.Exists(String virtualPath) 
at System.Web.WebPages.VirtualPathFactoryManager.Exists(String virtualPath) 
at System.Web.WebPages.DefaultDisplayMode.GetDisplayInfo(HttpContextBase httpContext, String virtualPath, Func`2 virtualPathExists) 
at System.Web.WebPages.DisplayModeProvider.GetDisplayInfoForVirtualPath(String virtualPath, HttpContextBase httpContext, Func`2 virtualPathExists, IDisplayMode currentDisplayMode, Boolean requireConsistentDisplayMode) 
at System.Web.WebPages.DisplayModeProvider.GetDisplayInfoForVirtualPath(String virtualPath, HttpContextBase httpContext, Func`2 virtualPathExists, IDisplayMode currentDisplayMode) 
at System.Web.WebPages.WebPageRoute.GetRouteLevelMatch(String pathValue, String[] supportedExtensions, Func`2 virtualPathExists, HttpContextBase context, DisplayModeProvider displayModeProvider) 
at System.Web.WebPages.WebPageRoute.MatchDefaultFiles(String pathValue, String[] supportedExtensions, Func`2 virtualPathExists, HttpContextBase context, DisplayModeProvider displayModes, String currentLevel) 
at System.Web.WebPages.WebPageRoute.MatchRequest(String pathValue, String[] supportedExtensions, Func`2 virtualPathExists, HttpContextBase context, DisplayModeProvider displayModes) 
at System.Web.WebPages.WebPageRoute.DoPostResolveRequestCache(HttpContextBase context) 
at System.Web.WebPages.WebPageHttpModule.OnApplicationPostResolveRequestCache(Object sender, EventArgs e) 
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)