30

教授が200mを超えて使用することは許可されていないと言っているクラスのために(Javaで)書いているプロジェクトがあります-Xmx50mでスタックメモリを50mに制限します(絶対に確実です)が、トップによると、まだ300mを使用しています

Eclipse Memory Analyzerを実行してみましたが、26mしか報告されません

これはすべてスタック上のメモリでしょうか?、約300のメソッド呼び出しを超えることはないと確信しています(はい、これは再帰的なDFS検索です)。したがって、すべてのスタックフレームがほぼ信じがたいメガバイト。

プログラムはシングルスレッドです。誰かが私がメモリ使用量を減らすかもしれない他の場所を知っていますか?また、スタックが使用しているメモリの量を確認/制限するにはどうすればよいですか?

更新:現在、次のJVMオプションを使用していますが、効果はありません(上部によると約300m):-Xss104k -Xms40m -Xmx40m -XX:MaxPermSize=1k

別の更新:実際、(これらすべてのオプションを使用して)少し長く実行すると、約半分の時間で4〜5秒後に突然150mに低下します(残りの半分は低下しません)。これを本当に奇妙なものにしているのは、私のプログラムには確率論的要素がないため(そして、私が言ったように、シングルスレッドであるため)、実行ごとに異なる動作をする必要がある理由はありません。

使用しているJVMと関係がありますか?

java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.3) (6b27-1.12.3-0ubuntu1~10.04)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)

java -hによると、デフォルトのJVMは-serverです。-cacaoを追加してみましたが、(他のすべてのオプションを使用して)わずか59mです。だから、これで私の問題は解決すると思います。なぜこれが必要だったのか誰かが説明できますか?また、知っておくべき欠点はありますか?

もう1つの更新:cacaoはサーバーと比較して本当に遅いです。これはひどいオプションです

4

5 に答える 5

21

Top コマンドは、Java アプリケーションによって使用されるメモリの合計量を反映します。これには、次のものが含まれます。

  • JVM 自体の基本的なメモリ オーバーヘッド
  • ヒープ領域 (-Xmx で制限)
  • 永久世代スペース (-XX:MaxPermSize - すべての JVM で標準ではありません)
  • スレッドのスタック スペース (スタックごとの -Xss) は、スレッドの数に応じて大幅に増加する可能性があります。
  • ネイティブ割り当てによって使用されるスペース (ByteBuffer クラスまたは JNI を使用)
于 2013-03-07T21:41:07.477 に答える
9
Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]

ここで、最大ヒープ メモリを -Xmx として、最小ヒープ メモリを -Xms として、スタック メモリを -Xss および -XX maxPermSize として

次の例は、この状況を示しています。次の起動パラメーターを使用して Tomcat を起動しました。

-Xmx168m -Xms168m -XX:PermSize=32m -XX:MaxPermSize=32m -Xss1m
于 2015-10-11T09:45:17.893 に答える
6

-Xmxヒープサイズを構成しています。スタック サイズを設定するには、-Xssパラメータを使用します。これら 2 つのパラメーターの合計は、おおよそ必要な値になります。

-Xmx150m -Xss50m

例えば。

また、-XX:MaxPermSize制御するパラメータもあります。このパラメータの-clientデフォルト値は 32mb、-server64mb です。構成に応じて、それも計算します。PermGen スペースは次のとおりです。

パーマネント ジェネレーションは、クラス オブジェクトやメソッド オブジェクトなどの VM 自体を反映したものを保持するために使用されます。

したがって、基本的には、クラス定義やインターンされた文字列など、JVM の内部データを格納します。

最後に、制御できない部分が 1 つあります。それは、ネイティブ Java プロセスによって使用されるメモリです。Java は他のプログラムと同様にプログラムであるため、メモリも使用します。タスク マネージャーでメモリ使用量を監視している場合は、このメモリとプログラムのメモリ消費量が一緒に表示されます。

于 2013-03-07T21:37:13.497 に答える
1

JVisualVMを使ってみましたか?

http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html

私はそれが私がこのようなものを追跡するのに役立つことをしばしば見つけました。ドリルインして何を調べても、各種類のメモリがどれだけ使用されているかがわかります。

于 2013-03-07T21:46:07.763 に答える