0

2 台の異なるマシンで 32 ビット バージョンの .net アプリケーションを実行しています。1 つは 32 ビット マシンで、もう 1 つは 64 ビット マシンです。

64 ビット環境では、32 ビット アプリケーションは WoW64 環境で実行されます。

64 ビット マシン構成は 4GB RAM です。

しかし、同じワークフローの同じアプリケーションが 32 ビット OS では 500 MB を消費し、64 ビット OS では 1 GB 以上を消費してクラッシュします。

これに関連する以下の記事を読みました。

http://blogs.sepago.de/helge/2008/03/11/windows-x64-all-the-same-yet-very-different-part-5

http://blogs.citrix.com/2011/10/13/wow64-memory-mapping-of-32bit-apps-running-on-a-64bit-windows/

しかし、彼らの分析は決定論的ではありません。この問題に直面した人はいますか? 32 ビット アプリを 64 ビット環境で実行するための推奨事項はありますか?

4

1 に答える 1

1

64 ビット モードの違いは次のとおりです。

  • 32 ビット コール スタックの代わりに 64 ビット コール スタック。さらに、WOW64 コール スタックがある

  • 32 ビット データ型の代わりに使用される 64 ビット データ型

  • 32 ビット DLL の代わりにロードされた 64 ビット DLL

コール スタックだけで 500 MB になる可能性はほとんどありません。通常、スタックには 1 MB が予約されていますが、コミットされているのは 64 kB のみです。

特に AnyCPU 用にコンパイルされた .NET アプリケーションがある場合は、データ型が問題になる可能性があります。純粋な 32 ビット アプリケーションをコンパイルしましたか?

DLL は大きな違いを生む可能性があります。特に一部の SQL DLL のサイズは 130 MB であるため、64 ビット バージョンをロードすると大きな違いが生じる可能性があります。2 倍のメモリ使用量についてはまだ説明されておらず、AnyCPU .NET アプリにのみ適用されます。

次の質問は、アプリケーションが 1 GB でクラッシュし、64 ビット オペレーティング システムで 2 GB (32 ビット) または 4 GB (AnyCPU) に近くならないのはなぜですか? あなたは正しいものを測定したと確信していますか?プライベート バイトのみ、またはワーキング セットのサイズを測定した可能性がありますが、どちらもここではあまり役に立ちません。

于 2013-09-17T21:42:52.160 に答える