4

WM6 プラットフォームで「古い」モバイル アプリケーションをサポートしています。古いデバイスが利用できなくなったため、最近、新しいデバイスにアップグレードする必要がありました。これは、WM6.1 から WM6.5 へのアップグレード、および .NET CF 2.0 から 3.5 へのアップグレードも意味します。

このアプリケーションの主な問題は、一定のメモリ不足 (OutOfMemoryExceptions) です。私はメモリリークを修正しようとし、メモリ消費のために特定のコードを最適化しました。ただし、新しいデバイスでは、全体の状況は古いデバイスよりもはるかに悪い. 利用可能な物理メモリの量に関係なく、各プロセスに 32MB の仮想メモリ制限があることを理解しています (興味深い読み取り)。

VirtualMemory.exeと Motorola eMScript を使用して、アプリケーションの 32MB メモリ スロットを視覚化/分析しました。プロセスの仮想メモリは次のようになります (合計 32MB、灰色のバーはそれぞれ 1MB を表し、上が新しいデバイス、下が古いデバイスです)。赤いバーの右側にあるものはすべて、サード パーティの DLL (OS、ベンダーなど) です。新しいデバイスに切り替えることで、さらに 3 MB を失いました。

仮想メモリ マップ

アプリケーションは、一部のサード パーティ製 DLL が右側 (最上位アドレス) の仮想メモリ アドレスを占有する「DLL クランチ」問題に苦しんでいるようです。注: 左側の青いバーは.exeで占められています。

では、私の質問は次のとおりです。アドレス空間を占有している DLL を特定するにはどうすればよいですか? すべての DLL とそのアドレスのリストを提供する eMScript を試しましたが、赤いバー (共有 DLL) の右側にあるものは提供しません。また、失われたアドレス空間の量を減らす方法に関する一般的な推奨事項やヒントはありますか? 「削減されたグラフィックス ドライバー」の使用を推奨する人がいますが、これが正しい問題に対処しているとはまだ確信していません。

これが関連する場合、新しいデバイスは Motorola MC65 です。

4

2 に答える 2

0

.NET CF アプリケーションで使用できるメモリを改善するには、.NET Compact Framework の MemMakerの記事で説明されているトリックを実装できます: すべてのマネージ コードを EXE から DLL に移動します。これは、32MB スロットのメモリを解放するのに役立ちます。

その他の関連記事はSlaying the Virtual Memory Monsterです。

于 2013-09-21T19:06:47.980 に答える