!!!参考 https://i-beam.org/2019/08/15/jvm-heap-sizing/ !!!JVMのメモリの使用量 http://promamo.com/?p=2828 JVMはヒープ以外にもかなりメモリを使っている。 {{img image01.png}} !!Eden領域 new演算子によって作成されたJavaオブジェクトが最初に格納される領域である。   !!Survivor領域 New領域に格納されていたJavaオブジェクトのうち,ガベージ・コレクション実行時に破棄されなかったJavaオブジェクトが格納される領域である。Survivor領域は,From空間とTo空間で構成される。From空間とTo空間のサイズは同じ。   !!Tenured領域 長期間必要であると判断されたJavaオブジェクトが格納される領域である。Survivor領域で指定回数を超えてガベージ・コレクションの実行対象となり,破棄されなかったJavaオブジェクトが,この領域に移動される。   !!Permanent領域 ロードされたclassなどの情報が格納される領域である。   !!Cヒープ領域 JVM自身が使用する領域である。   !!スタック領域 Javaスレッドのスタック領域である。 !!!jstat http://manned.org/jstat/443de6d7 !!vmidの確認 jps でJavaプロセスのvmidを確認する。 !!jstatの実行 jstat -オプション vmid 更新ms jstat -gc 1234 1000 !オプション ,, ,class ,クラス・ローダーの動作に関する統計データ ,compiler ,HotSpot Just-in-Timeコンパイラの動作に関する統計データ ,gc ,ガベージ・コレクトされたヒープの動作に関する統計データ ,gccapacity ,世代ごとの容量と対応する領域に関する統計データ ,gccause ,ガベージ・コレクション統計データの概要(-gcutilと同じ)と、直前および現在(適用可能な場合)のガベージ・コレクション・イベントの原因 ,gcnew ,New世代の動作に関する統計データ ,gcnewcapacity ,New世代のサイズと対応する領域に関する統計データ ,gcold ,Old世代およびPermanent世代の動作に関する統計データ ,gcoldcapacity ,Old世代のサイズに関する統計データ ,gcpermcapacity ,Permanent世代のサイズに関する統計データ ,gcutil ,ガベージ・コレクション統計データの概要 ,printcompilation ,HotSpotコンパイル方法の統計データ !-classオプション クラス・ローダーの統計データ ,列,説明 ,Loaded ,ロードされたクラスの数 ,Bytes ,ロードされたKB数 ,Unloaded ,アンロードされたクラスの数 ,Bytes ,アンロードされたKB数 ,Time ,クラスのロードやアンロード処理に要した時間 !-compilerオプション HotSpot Just-In-Timeコンパイラの統計データ ,列 ,説明 ,Compiled ,実行されたコンパイル・タスクの数 ,Failed ,失敗したコンパイル・タスクの数 ,Invalid ,無効にされたコンパイル・タスクの数 ,Time ,コンパイル・タスクの実行に要した時間 ,FailedType ,最後に失敗したコンパイルのコンパイル・タイプ ,FailedMethod,最後に失敗したコンパイルのクラス名とメソッド !-gcオプション ガベージ・コレクトされたヒープの統計データ ,列 ,説明 ,S0C ,Survivor領域0の現在の容量(KB) ,S1C ,Survivor領域1の現在の容量(KB) ,S0U ,Survivor領域0の使用率(KB) ,S1U ,Survivor領域1の使用率(KB) ,EC ,Eden領域の現在の容量(KB) ,EU ,Eden領域の使用率(KB) ,OC ,Old領域の現在の容量(KB) ,OU ,Old領域の使用率(KB) ,PC ,Permanent領域の現在の容量(KB) ,PU ,Permanent領域の使用率(KB) ,YGC ,若い世代のGCイベント数 ,YGCT ,若い世代のガベージ・コレクション時間 ,FGC ,フルGCイベント数 ,FGCT ,フルガベージ・コレクション時間 ,GCT ,ガベージ・コレクション総時間 !-gccapacityオプション メモリー・プール世代および領域容量 ,列 ,説明 ,NGCMN ,New世代の最小容量(KB) ,NGCMX ,New世代の最大容量(KB) ,NGC ,New世代の現在の容量(KB) ,S0C ,Survivor領域0の現在の容量(KB) ,S1C ,Survivor領域1の現在の容量(KB) ,EC ,Eden領域の現在の容量(KB) ,OGCMN ,Old世代の最小容量(KB) ,OGCMX ,Old世代の最大容量(KB) ,OGC ,Old世代の現在の容量(KB) ,OC ,Old領域の現在の容量(KB) ,PGCMN ,Permanent世代の最小容量(KB) ,PGCMX ,Permanent世代の最大容量(KB) ,PGC ,Permanent世代の現在の容量(KB) ,PC ,Permanent領域の現在の容量(KB) ,YGC ,若い世代のGCイベント数 ,FGC ,フルGCイベント数 !-gccauseオプション このオプションは、-gcutilオプションと同じガベージ・コレクション統計データの概要を表示しますが、最後のガベージ・コレクション・イベントと(適用可能な場合は)現在のガベージ・コレクション・イベントの原因が含まれます。-gcutilで一覧表示される列のほか、このオプションでは次の列が追加されます。 GCイベントを含むガベージ・コレクション統計データ ,列 ,説明 ,LGCC ,最後のガベージ・コレクションの原因 ,GCC ,現在のガベージ・コレクションの原因 !-gcnewオプション New世代の統計データ ,列 ,説明 ,S0C ,Survivor領域0の現在の容量(KB) ,S1C ,Survivor領域1の現在の容量(KB) ,S0U ,Survivor領域0の使用率(KB) ,S1U ,Survivor領域1の使用率(KB) ,TT ,殿堂入りしきい値 ,MTT ,最大殿堂入りしきい値 ,DSS ,適切なSurvivorサイズ(KB) ,EC ,Eden領域の現在の容量(KB) ,EU ,Eden領域の使用率(KB) ,YGC ,若い世代のGCイベント数 ,YGCT,若い世代のガベージ・コレクション時間 !-gcnewcapacityオプション New世代領域サイズの統計データ ,列 ,説明 ,NGCMN ,New世代の最小容量(KB) ,NGCMX ,New世代の最大容量(KB) ,NGC ,New世代の現在の容量(KB) ,S0CMX ,Survivor領域0の最大容量(KB) ,S0C ,Survivor領域0の現在の容量(KB) ,S1CMX ,Survivor領域1の最大容量(KB) ,S1C ,Survivor領域1の現在の容量(KB) ,ECMX ,Eden領域の最大容量(KB) ,EC ,Eden領域の現在の容量(KB) ,YGC ,若い世代のGCイベント数 ,FGC ,フルGCイベント数 !-gcoldオプション OldおよびPermanent世代の統計データ ,列 ,説明 ,PC ,Permanent領域の現在の容量(KB) ,PU ,Permanent領域の使用率(KB) ,OC ,Old領域の現在の容量(KB) ,OU ,Old領域の使用率(KB) ,YGC ,若い世代のGCイベント数 ,FGC ,フルGCイベント数 ,FGCT ,フルガベージ・コレクション時間 ,GCT ,ガベージ・コレクション総時間 !-gcoldcapacityオプション Old世代の統計データ ,列 ,説明 ,OGCMN,Old世代の最小容量(KB) ,OGCMX,Old世代の最大容量(KB) ,OGC ,Old世代の現在の容量(KB) ,OC ,Old領域の現在の容量(KB) ,YGC ,若い世代のGCイベント数 ,FGC ,フルGCイベント数 ,FGCT ,フルガベージ・コレクション時間 ,GCT ,ガベージ・コレクション総時間 !-gcpermcapacityオプション Permanent世代の統計データ ,列 ,説明 ,PGCMN,Permanent世代の最小容量(KB) ,PGCMX,Permanent世代の最大容量(KB) ,PGC ,Permanent世代の現在の容量(KB) ,PC ,Permanent領域の現在の容量(KB) ,YGC ,若い世代のGCイベント数 ,FGC ,フルGCイベント数 ,FGCT ,フルガベージ・コレクション時間 ,GCT ,ガベージ・コレクション総時間 !-gcutilオプション ガベージ・コレクション統計データの概要 ,列 ,説明 ,S0 ,Survivor領域0の使用率(現在の容量に対するパーセンテージ) ,S1 ,Survivor領域1の使用率(現在の容量に対するパーセンテージ) ,E ,Eden領域の使用率(現在の容量に対するパーセンテージ) ,O ,Old領域の使用率(現在の容量に対するパーセンテージ) ,P ,Permanent領域の使用率(現在の容量に対するパーセンテージ) ,YGC ,若い世代のGCイベント数 ,YGCT,若い世代のガベージ・コレクション時間 ,FGC ,フルGCイベント数 ,FGCT,フルガベージ・コレクション時間 ,GCT ,ガベージ・コレクション総時間 !-printcompilationオプション HotSpotコンパイル方法の統計データ ,列 ,説明 ,Compiled ,実行されたコンパイル・タスクの数 ,Size ,メソッドのバイトコードのバイト数 ,Type ,コンパイル・タイプ ,Method ,コンパイル方法を特定するクラス名とメソッド名。クラス名では、名前空間の区切り文字として、「.」のかわりに「/」が使用されます。メソッド名は、指定されたクラス内のメソッドです。これらの2つのフィールドの形式は、HotSpot !!!コンテナ向けメモリ確認 Dockerなどのコンテナ内でのメモリ確認、指定で使えそうなオプション !!設定値確認 !-XshowSettings すべての設定を表示 java -XshowSettings --version vmの設定を表示 java -XshowSettings:vm --version 利用できる最大ヒープメモリサイズも表示されるので、最大ヒープサイズを確認するときに便利 !-XX:+PrintFlagsFinal こちらもjvmの各種パラメータを確認できる java -XX:+PrintFlagsFinal --version 利用できるヒープサイズを確認したいときはgrepなどで絞る java -XX:+PrintFlagsFinal --version | grep MaxHeap !!ヒープサイズ指定 dockerの--memoryオプションでカーネルの CGroup という機能を使って、コンテナ内で利用できるメモリを制限できる。 しかし、コンテナ内でfreeで確認するとホストのメモリ量が表示される。 Java10からは UseContainerSupport オプションによりCGroupのCPU、メモリの値を取得するようになった。 UseContainerSupport オプションはデフォルトで有効になっています。 ただし、DockerのバージョンによってはCGroup の値を正しく取得できないことがあるで注意。 !UseContainerSupport コンテナサポートのオプション。デフォルトで有効になっています。 確認 java -XX:+PrintFlagsFinal --version | grep UseContainerSupport 無効にする -XX:-UseContainerSupport 例 java -XX:+PrintFlagsFinal -XX:-UseContainerSupport --version | grep UseContainerSupport 有効にする -XX:+UseContainerSupport 通常はデフォルトで有効になっているので余り使う機会はないが、環境によっては 例 java -XX:+PrintFlagsFinal -XX:+UseContainerSupport --version | grep UseContainerSupport !MaxRAMPercentage ヒープサイズの最大値をパーセンテージで指定できる。 java -XshowSettings:vm -XX:MaxRAMPercentage=50 -version ヒープ以外の領域もあるでどんなに大きくても30%〜50%がいいと思う。 !MaxHeapSize 従来の-Xmxと同じ。最大ヒープサイズを絶対値で指定する java -XX:+PrintFlagsFinal -XX:MaxHeapSize=512m -XshowSettings:vm --version | grep -i maxheap java -XX:+PrintFlagsFinal -Xmx512m -XshowSettings:vm --version | grep -i maxheap {{category2 プログラミング言語,Java}}