1

CF9 サーバー用に JVM を設定して、最大 2GB のヒープ スペースを割り当てます。通常、約 750MB から 1GB しか割り当てられず、実際に使用するのは約 500MB だけです。

不正なスクリプトが起動され、最終的にヒープ スペースが占有されたため、JVM は 2GB の制限をすべて割り当てました。現在、割り当てられた 2GB のうち 500MB のみを使用して、通常のペースでの実行に戻り、サーバーのメモリ使用率は 90% になりました。

それほど多くの割り当てが必要なくなったときに、JVM の最大ヒープ領域を縮小するために使用できる設定はありますか? または、これは次の再起動まで常にこのままになりますか? サーバー上のメモリが 10% しか残っていないので、"小刻みに動く" ための部屋を用意しておきましょう...

ありがとう!

編集:

もう少し明確にするために。JVM 引数「-Xms750m」を設定して、初期ヒープ サイズを 750MB に設定します。JVM引数「-Xmx2048M」によって設定された最大ヒープサイズ。スクリプトを実行する前は、割り当てられたヒープ サイズは約 1GB でした。この 1GB のうち、実際に使用していたのは平均で 500MB だけでした。スクリプトの実行後、ヒープは限界までプッシュされたため、2 GB の事前割り当てヒープ領域があり、平均で 500 MB しか使用していません。

したがって、これにより Windows は 90% 以上のメモリ使用量を記録しています。JVM は使用されないため、おそらく少なくとも 1 GB かそれ以上は解放される可能性がありますが、それを強制的に発生させる方法や、これを行うための何らかの JVM 設定があるかどうかはわかりません。自動的。

4

2 に答える 2

1

完全な GC を実行すると、ヒープが縮小されます。最小で 750 MB あれば、OS はそのメモリを「再利用」できます (実際には何もする必要はありません)。ただし、メモリに制約がある場合は、将来的に競合の問題が発生する可能性があるため、チューニングを少し改善することを検討してください。この問題について深く考える必要がないように、通常は最小値と最大値を同じに設定します。とにかく - これがあなたを助けるかもしれないスクリプトです:

<Cfset runtime = CreateObject("java","java.lang.Runtime").getRuntime()>

<cfset fm = runtime.freememory()/>

<Cfset fm = int((fm/1024)/1024)/>

<cfset usedmem = 1270-fm/>
<cfoutput><br>
<br>
Free: #fm# megs<br>
Used: #usedmem# megs<br>
</cfoutput>

<cfset obj = createObject("java","java.lang.System")/>

    <cfset obj.gc()/>

    <cfset obj.runFinalization()/>

スクリプトの最初の部分では空きメモリが表示され、2 番目の部分では完全なガベージ コレクションが実行されます (完全な一時停止も行われるため、トラフィックとハードウェアによっては、これが顕著になる可能性があります)。

幸運を :)

于 2012-07-18T16:20:16.673 に答える
0

ヒープが再び 500 メガバイトの報告に戻った場合、何が起こっているかについていくつかの可能性があります。

メモリは PermGen で使用されます。Perm はガベージ コレクターによって同じ方法でクリアされることはありません (あったとしても)。サーバー上の JDK から JPS または JVisualVM を実行できる場合は、Perm Gen の使用状況がレポートされるため、メモリが使用されている場所を把握できる場合があります。

もう 1 つの可能性は、使用している OS の測定値が、現在のメモリではなく、プロセスによって使用される最大メモリを反映していることです。私はここの専門家ではありませんが、メモリ使用量を示すために使用しているメトリックを正確に投稿できれば役立つかもしれません.

私は、JVMがメモリを解放していない可能性があると思います.Garbage CollectedはOSに戻っていますが、私はそれが起こるのを見たことはありません.

不正なスクリプトが実行されたとき、クラッシュする前にヒープ全体が必要だったとあなたは言います。OutOfMemoryException で停止しましたか? 例外ログをスキャンすると、どのスレッドがクラッシュしたかについて何か書かれていますか? 通常、JVM で OOM が発生すると、アプリケーションの状態が破損しているかどうかがわからないため、おそらく再起動する必要があります。

于 2012-07-18T16:19:31.680 に答える