アプリケーションが使用しているメモリの総量を知りたい場合は、かなり長い間監視する必要があります。アプリケーションのランダムな瞬間のヒープのサンプル:
jps -> output the pid of java process
jmap -dump:live,format=b,file=heap.bin [pid]
次にjhat
、ヒープをナビゲートします。そうするための別のツールがあります。
これを行うと、現時点でヒープに何があるかがわかります。
などのオブジェクトmemory mapped files
はヒープではなくメモリに格納されることに注意してください。
到達したらOOM
、これを追加してから、出力を読み取って、実際にヒープ内にあるオブジェクトを確認してください。
-XX:-HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid<pid>.hprof
これを行うには、を有効にしてから、GCViewerGC log
などのツールを使用します。
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-verbose:gc
-Xloggc:garbage_collector -> this set the file of the output
ヒープについて話すとき、私はあなたがtenured
スペースについて話していることを理解しています。もしそうなら、あなたはオブジェクトの平均寿命を知る必要があります。そして、いくつかのベストプラクティスに従って、微調整を行います。また、を発行してSystem.gc()
も、が実行されることを保証するものではないことに注意してGC
ください。
事はインスタンスが行きyoung generation (eden)
、それがいっぱいになるminor GC
と実行されるということです。まだ到達可能なオブジェクトは、と呼ばれる2つのスペースのいずれかに渡されsurvivor
ます。これがいっぱいになると、そのスペースはにダンプされtenured
ます。いっぱいになると、がfull GC
実行され、到達できないすべてのインスタンスが削除されます。
できることの1つはprimitives
、メソッドで使用することです。それらの寿命はスレッドスタックにあるため、それらはヒープに配置されません。
有用なパラメータは、のサイズを結び付けるパラメータですtenured and young generation (eden)
。これらは比率で機能します。多くを発行する場合はGC
、の最大時間を設定することを念頭に置いてGC stop
ください。
いくつかの興味深いパラメータは次のとおりです。
-XX:MinFreeHeapRatio=
-XX:MaxHeapFreeRatio=
-XX:NewRatio=
-XX:SurvivorRatio
たとえば、設定-XX:NewRatio=3
とは、若い世代と古い世代の比率が1:3であることを意味します。つまり、エデンとサバイバースペースの合計サイズはヒープの4分の1になります。
とにかく、なぜこの要件が必要なのかわかりません。私は通常、についてのみ心配し、が悪いthroughput
場合にのみこれらのパラメーターを気にします。throughput