JVM入門
きかっけ
IntelliJでホットスワップできる仕組みを知りたい
なぜ重たいか
JVMの起動が遅い
クラスローダの読み込み
DIコンテナ初期化
Tomcat起動
JITコンパイル・・・・
JVM解説スライド
https://scrapbox.io/files/68d735a813a4577fde24e6d3.png
標準ホットスワップの流れ
Javaファイルをクラスファイルにコンパイル
JVMTIを使ったクラス再定義
IntelliJからJVMTIに向かって変更通知を出す。クラスローダーは介さず、直接JVMのRuntime領域を触る
クラス再定義は、既にロードされたクラスのバイトコードを置き換える行為
JVMTI(JVM Tool Interface)は、実行中のJavaアプリケーションの状態を監視・制御するためのプログラミングインターフェース
メソッドエリア(メタスペース)の更新
https://scrapbox.io/files/68d73d9af68f5917f884319e.png
メソッド追加、フィールド追加が不可な理由
①メソッドシグネチャ変更が不可能な理由
定数プール参照の問題
新しいメソッドには新しい定数プール エントリが必要
既存のバイトコード内のインデックスがずれる可能性
Virtual Method Table (vtable) の問題
vtableはクラスロード時に構築・固定される
既存オブジェクト(インスタンス)のvtableポインタを変更するのは困難
②フィールド追加・削除が不可能な理由
既存のオブジェクトインスタンス(ヒープ上)のメモリレイアウトは変更不可
DCEVMというJVM改造ツールを使用することで、メソッド追加等も検出可能になるらしい
どらくらい速度が上がる
120秒 → 12秒
1日10回 再起動 1000/60 =
# 補足
JVM JITの仕組み
Gemini壁打ち
要は影響範囲がそのクラスのメソッドだけじゃなく呼び出し先や継承先や既存のインスタンスに影響