Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

瞬間的にメモリを使用するアプリのチューニング方法

普段は常駐していて30MB程度しかヒープを使用しておらず、
あるタイミングで瞬間的に1GBほどのメモリを食うようなアプリを作成しているのですが、
普段は最低限のメモリしか使用しないようにするには、
JVMにどういったオプションを与えてあげれば良いのでしょうか。
今は一度1GBまで使用済みヒープが増えてしまうと、確保されたヒープサイズが減らずに
いつまでも邪魔になってしまっています(使用済みは30MBまで減っています)。
あまりチューニングを真面目にやったことがないため無茶なことを言っているかもしれませんが、
ご助言いただければ幸いです。

6

回答

3802

閲覧

6件の回答

評価

0

邪魔って、何の邪魔?
他のアプリがメモリを要求してない以上、とくに支障はないはずだが?
他のアプリがメモリを要求すれば、解放されるかも知れない。

今のOSは(アクティブが優先的に物理メモリを使う可能性が高いとは言え)使用メモリの実体が動的に変化するし、アプリ内の解放ができてるなら気にしないでいい。

評価

0

回答ありがとうございます。
本文にも記載した通り常駐型のアプリとなりますので、普段はほかのアプリケーションも使用されます。
本アプリがメモリ消費の激しい処理を行った後、別のアプリがメモリを要求したらヒープ領域は開放されていくものと私も認識していたのですが、
JVMが確保したヒープ領域はFullGCでも発生しない限り開放されないようです。
しかし、FullGCは任意で実行できるようなものでもないため、今回の質問に至っております。

引き続き、ご回答お待ちしております。

評価

30

http://gihyo.jp/dev/serial/01/jvm-arc/0009

おそらくマルチコアのCPU使ってて、デフォでパラレルGCが設定されてるんだろう。
パラレルGCだと、ヒープが縮小されないようになってる(将来の使用に備えてとっておいてる)。
-XX:+UseG1GC オプションをつけて、GC方式を変更し、ヒープ縮小したい箇所で System.gc(); を呼べばおそらく改善する。

評価

0

ちなみに、デフォルトの GC方式は、java -XX:+PrintCommandLineFlags -version とコマンドプロンプトで打てば確かめられる。そこに、-XX:+UseParallelGC ってあったら多分それが原因。

評価

0

JDK7 のデータだけど、ここが参考になるかもな。
OSにメモリを返してくれるGCと返してくれないGCがある。

http://www.stefankrause.net/wp/?p=14

評価

0

回答ありがとうございます。まさに求めていたものです!
ひとまずG1GCに変更して、ヒープが縮小されることを確認できました。
貼っていただいたURLを参考に、引き続きチューニングを進めたいと思います。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。