Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

jconsoleを使ってメモリ領域を覗いてみた。障害対応で学んだTips集

Avatar for k.fujikawa8 k.fujikawa8 PRO
November 26, 2025
2

 jconsoleを使ってメモリ領域を覗いてみた。障害対応で学んだTips集

JJUG 2023 秋 ふじきゃわ発表

Avatar for k.fujikawa8

k.fujikawa8 PRO

November 26, 2025
Tweet

Transcript

  1. 初学の頃 サンプル問題 Static変数(クラス変数) インスタンス変数 持ち主 クラス インスタンスオブジェクト 共有 インスタンス間で共有できる インスタンス間で共有できない

    GCタイミング クラスがアンロードされるまで存在 オブジェクトがGCされるタイミング同時に回 収 格納先 ヒープメモリ? ヒープメモリ Public class TestClass{ public static int staticCounter = 0;//static変数 public int instanceCounter = 0;//インスタンス変数 } Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 7
  2. 初学の頃 サンプル問題 public class ExampleClass { public static int staticCounter

    = 0;//static変数 public int instanceCounter = 0;//インスタンス変数 public ExampleClass() { //コンストラクタ staticCounter++; instanceCounter++; } } public class TestClass { public static void main(String[] args) { ExampleClass obj1 = new ExampleClass(); ExampleClass obj2 = new ExampleClass(); } } Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 8
  3. public class ExampleClass { public static int staticCounter = 0;//static変数

    public int instanceCounter = 0;//インスタンス変数 public ExampleClass() { staticCounter++; instanceCounter++; } } public class TestClass { public static void main(String[] args) { ExampleClass obj1 = new ExampleClass(); ExampleClass obj2 = new ExampleClass(); } } System.out.println(obj2.staticCounter); System.out.println(obj2.instanceCounter); 実行結果 Staticカウント:2 インスタンスカウント:1 初学の頃 Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 9
  4. OutOfMemoryErrorとの初めての出会い ArrayList<String> list = new ArrayList<>(); while (true) { list.add("Hello

    World"); } サンプル問題 Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 13
  5. OutOfMemoryErrorとの初めての出会い • a) 無限ループにより、リストへの要素追加が終わらない。 • b) "Hello World" 文字列がヒープメモリを使い切る。 •

    c) ArrayListが正しく使用されていない。 • d) Javaのガベージコレクションがリストの要素を削除できない。 ArrayList<String> list = new ArrayList<>(); while (true) { list.add("Hello World"); } サンプル問題 Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 14
  6. OutOfMemoryErrorとの初めての出会い • a) 無限ループにより、リストへの要素追加が終わらない。 • b) "Hello World" 文字列がヒープメモリを使い切る。 •

    c) ArrayListが正しく使用されていない。 • d) Javaのガベージコレクションがリストの要素を削除できない。 ArrayList<String> list = new ArrayList<>(); while (true) { list.add("Hello World"); } Answer サンプル問題 Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 15
  7. OutOfMemoryErrorとの初めての出会い • a) 無限ループにより、リストへの要素追加が終わらない。 無限ループとなり、ヒープメモリに"Hello World"という文字列のコピーを無限 に追加していきます。Javaのヒープメモリには限りがあるため、いずれは OutOfMemoryErrorが発生します。 ArrayList<String> list

    = new ArrayList<>(); while (true) { list.add("Hello World"); } Answer サンプル問題 Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 16 無限ループとなり、ヒープメモリに"Hello World"という文字列のコピー を無限に追加していきます。Javaのヒープメモリには限りがあるため、 いずれはOutOfMemoryErrorが発生します。
  8. OutOfMemoryErrorとの初めての出会い • a) 無限ループにより、リストへの要素追加が終わらない。 無限ループとなり、ヒープメモリに"Hello World"という文字列のコピーを無限 に追加していきます。Javaのヒープメモリには限りがあるため、いずれは OutOfMemoryErrorが発生します。 ArrayList<String> list

    = new ArrayList<>(); while (true) { list.add("Hello World"); } Answer サンプル問題 Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 17 無限ループとなり、ヒープメモリに"Hello World"という文字列のコピー を無限に追加していきます。Javaのヒープメモリには限りがあるため、 いずれはOutOfMemoryErrorが発生します。
  9. どうやって対処すればいいんだ・・・。 サンプル問題 あれ・・・。直らないな・・。 というかGCされているのか!? メモリの中見えないから設定が反映されているのかどうかも分からん! Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 23 むむむ!

    運用時の設定に「-XX:MaxMetaspaceSize=128M」というのがあるな。 前から使ってた設定はあまり変えたくないから・・・。 とりあえず、メタスペースのGCを実施する目安サイズ指定設定 「-XX:MetaspaceSize=100M」 というのをなんとなく100Mくらいで入れてみよう!
  10. パソコンはざっくりいうと以下の構成で作られている パソコンの中身 (C) 2023 K-PROJECT Co., Ltd. 45 ①マザーボード みんなを乗せる板

    ②CPU 頭脳 強ければPC超早い ③主記憶(メモリ) 容量少ないけど記憶の出し入れ簡単 ④補助記憶(ハードディスク) 容量めっちゃ多い たくさん記憶でき る
  11. ヒープ領域について Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 52 | ←Javaヒープ→ | | ←ネィティブメモリ→

    | New 世代 Metaspace Old 世代 ヒープ 非ヒープ JVMの実行など システムリソースとして使用する領域 Javaがオブジェクトを 動的に割り当てる領域
  12. Metaspace領域について Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 53 Metaspace領域 New 世代 Metaspace Old

    世代 Javaのclassのメタデータやメソッドなどの永続的に参照される静的オブジェクトを管 理する領域です。 基本的に、画面を開いてサーブレットJava(クラス)が動いたり、ボタンを押して何か のJavaのメソッドが走ると、Metaspaceの使用量が増えていきます。
  13. Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 54 Metaspace領域 New 世代 Metaspace Old 世代

    Javaのclassのメタデータやメソッドなどの永続的に参照される静的オブジェクトを管 理する領域です。 基本的に、画面を開いてサーブレットJava(クラス)が動いたり、ボタンを押して何か のJavaのメソッドが走ると、Metaspaceの使用量が増えていきます。 Metaspace領域について
  14. GCについて 補足 Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 55 | ←Javaヒープ→ | |

    ←ネィティブメモリ→ | New 世代 Metaspace Old 世代 ヒープ 非ヒープ 基本的にGCされないが、 ヒープ領域がGCされることで 一緒に整理されるデータあり GC(ガベージコレクション)の対象
  15. 初学の頃 (回想) サンプル問題 Static変数(クラス変数) インスタンス変数 持ち主 クラス インスタンスオブジェクト 共有 インスタンス間で共有できる

    インスタンス間で共有できない GCタイミング クラスがアンロードされるまで存在 オブジェクトがGCされるタイミング同時に回収 格納先 ヒープメモリ? ヒープメモリ Public class TestClass{ public static int staticCounter = 0;//static変数 public int instanceCounter = 0;//インスタンス変数 } Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 56
  16. 初学の頃 (回想) サンプル問題 Public class TestClass{ public static int staticCounter

    = 0;//static変数 public int instanceCounter = 0;//インスタンス変数 } Jconsoleを使ってメモリ領域を覗いてみた。障害対応で 学んだTips集 #2023.11.11/JJUG 57 Static変数(クラス変数) インスタンス変数 持ち主 クラス インスタンスオブジェクト 共有 インスタンス間で共有できる インスタンス間で共有できない GCタイミング クラスがアンロードされるまで存在 オブジェクトがGCされるタイミング同時に回 収 格納先 ヒープメモリ? ヒープメモリ