31

Java のバックグラウンドを持つ私が慣れ親しんでいることの 1 つは、JVM に最大ヒープ サイズを指定することです。実行中のプログラムが許可されている以上のリソースを飲み込もうとし、ガベージ コレクターがこれ以上リソースを解放できない場合、OutOfMemoryError がスローされ、すべてが爆発します。そのため、Java では最大ヒープ サイズを設定することが重要です。

これは .net に適用されますか? ヒープ サイズの制限を設定できますか? CLR は、マシンの物理的な限界に達するまでヒープを増やし続けますか? それとも、Java ウィンカーが原因で見えなくなったのは、何らかの微妙な理由で .net の問題ではないのでしょうか?

4

4 に答える 4

27

プロセスで CLR を自分でホストしない限り、.Net で最大ヒープ サイズを設定することはできません。

編集: 最大ヒープ サイズを含む CLR のメモリ割り当てを制御するには、ホスティング API を使用して clr をホストし、具体的には「メモリ マネージャー インターフェイス」を使用する必要があります。いくつかのスターター情報は、MSDN マガジンのコラム CLR Inside Out にあります。 : CLR ホスティング API

編集:あなたの質問に答えるために、なぜメモリ割り当てまたは特に最大ヒープサイズを制御したいのですか?通常はしたくありませんが、SQL ServerやIIS、またはリアルタイムアプリケーションのようなアプリケーションを作成している場合次に、メモリを制御し、具体的にはページングを回避するかなりの理由があります。そうしないと、CLR自体とOSがすでにかなりうまく機能しており、残っているのは、そのアプリケーションが最小限のリソースを使用するようにすることです。うまく機能すること。

于 2008-11-19T09:57:03.860 に答える
17

いいえ、.NET には適用されません。ヒープは、それ以上成長できなくなるまで実際に成長し続けます。(明らかに、これは「GC を介してメモリを回復しようとした後、ヒープを大きくする」ことです。) 基本的に、.NET GC で利用できるチューニングは Java ほど多くありません。サーバー GC またはクライアント GC を選択できます。並行 GC をオン/オフするオプションがあると思います (リンクはすぐに見つかります) が、基本的にはそれだけです。

編集:大量ではありませんが、もう少しあるようです。Rick Minerich の GC 設定に関するブログ エントリそれに続くエントリは、この問題について私よりも多くのことを知っているようです。これらはおそらく、さらなる調査の出発点として適していますが、JVM で使用可能なメモリ制限のようなものではなく、ほとんどがフラグです。

編集:ポップの答えは良い点を提起します-私は「通常の」CLRホスティングモデルを想定しています(つまり、あなたの管理下にありません)。自分でホストする努力をしたい場合は、ホストする余分な作業を犠牲にして、より多くの制御を得る可能性があります. 私は物事のその側面を調べたことがあるとは言えません。

于 2008-11-19T09:49:40.113 に答える
11

System.Runtime.MemoryFailPointを見たいと思うかもしれません。

于 2009-03-18T17:01:01.577 に答える
7

私の知る限り、CLR を使用して .Net アプリのヒープのサイズを制御する簡単な方法はありません。

上記のリンクは、半分しか答えていません。この同じ問題を調査したところ、最大ヒープ サイズを制御したい唯一の理由であるかのように、「ヒープは利用可能なすべてのメモリを使用するように成長します」という応答がありました。

(通常は Java) サーバー環境では、動作の悪いアプリが他のホストされたアプリを犠牲にしてメモリを占有することは望ましくありません。簡単な解決策は、アプリがヒープに使用できるメモリの量を制限することです。これは、Java の -Xmx 引数で実現されるため、アプリが計画された以上に使用しないことを保証できます (例: -Xmx256M)。初期化中にヒープにメモリを割り当てるとアプリの起動が遅くなる可能性があるため、Java は -Xms 引数を使用して、初期化中に大量のオブジェクト作成を行うアプリが、JVM が継続的にヒープのサイズを変更する代わりに、ヒープの大きなブロックで開始できるようにします。行きます。

.Net の CLR には、この機能がありません。.Net の CLR が仮想マシンではないためだと思われます。CLR はたまたま API であり (非常に包括的なものだと付け加えるかもしれません)、ネイティブ .dll へのアダプターとして機能します。これは、メモリ管理に関しては、実行可能ファイルに似たアプローチに相当します。

SharePoint の開発についてこの質問をしたところ、Web Apps と呼ばれる IIS モジュールを使用してヒープサイズを制御できる可能性があると聞きました。これにより、特定の Web アプリのメモリを制限するよう IIS に指示できます。これは、IIS が new()/malloc()/etc を置換/オーバーライドするルーチンをカスタマイズしているため、このタイプの制御をクライアント アプリに提供できるためではないでしょうか。つまり、C++ でカスタム メモリ マネージャーを作成し、.Net 用のインターフェイスを作成する場合を除き、スタンドアロンの .Net アプリは運が悪いということです。

于 2009-08-05T15:31:42.677 に答える