教授が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はサーバーと比較して本当に遅いです。これはひどいオプションです