SlideShare ist ein Scribd-Unternehmen logo
1 von 43
© 2020 NTT DATA Corporation
JVMに裏から手を出す!
JVMTIに触れてみよう
2020年9月19日
株式会社NTTデータ 技術開発本部
末永 恭正
オープンソースカンファレンス2020 Online/Hiroshima
© 2020 NTT DATA Corporation 2
自己紹介
• 末永 恭正
• NTTデータ 技術革新統括本部
• OpenJDK Reviewer
YaSuenag
© 2020 NTT DATA Corporation 3
本日のテーマ
Java
Virtual
Machine
Tool
Interface
Java仮想マシンが備える
Javaのデバッグや監視に便利な
インターフェース(API)
© 2020 NTT DATA Corporation 4
https://docs.oracle.com/javase/jp/14/
https://docs.oracle.com/javase/jp/14/docs/specs/jvmti.html
© 2020 NTT DATA Corporation 5
JVMTI
• APIインターフェース:C/C++
• JNI+αなイメージ
• メソッド呼び出しなど、JNIもよく使います
• 共有ライブラリ形式のイベントドリブンなエージェントプログラム
• 2つの開始タイミング(プロセス同期、動的アタッチ)
• 機能
• JVM内部イベントのフック
• クラス書き換え
• オブジェクト参照関係の追跡 など
© 2020 NTT DATA Corporation 6
イベントドリブン
エージェント
ロード
JVM開始 JVM終了 エージェント
アンロード
スレッド開始
クラスロード
GC
例外発生 メソッド実行
エージェント
アタッチ
…
• JVMの内部では様々なイベントが飛び交っている!
• JVMのライフサイクルの中で様々なイベントが発生
• イベントをどう捌くかがJVMTIエージェントのキモ!
• イベントを拾いすぎたり、ハンドラが重いとアプリケーションへ悪影響
© 2020 NTT DATA Corporation 7
JVMTIエージェントを作る、ということ
+ JVM実装固有
イベント
JVMTI定義イベント
やりたいことのトリガとなるイベントを見つけて
できるだけ軽い動作をさせる!
© 2020 NTT DATA Corporation 8
実は身近!?JVMTIの利用例
• IDE、エディタのデバッガの足廻り
• Java Debugger Interface(JDI)
• EclipseやVS Codeなどで使われる、ポピュラーなもの
• Java Flight Recorder
• Java 11からOSS化された軽量なプロファイラ
• クラス情報を差し替えるためJVMが内部的に利用
• HeapStats
• メモリトラブル早期解決を助けるOSSの監視ツール
• GC動作状況やメモリ不足発生をリアルタイムに把握
© 2020 NTT DATA Corporation
サンプルで理解する
JVMTI
© 2020 NTT DATA Corporation 10
3つのサンプル
1. Hello World
• JVMTIエージェントの開始/終了を体験する
• 2つの開始タイミングを体験する
2. はじめてのイベントフック
• JVM内部イベントのフックを体験する
• JVMの実行フェーズ、JVMTI機能の実行に必要な権限を
理解する
3. 自家製GCログ
• JVMTIを活用した独自のロギング機能を作成する
• JVMTIエージェントがJVMの挙動に与える影響を体験する
https://github.com/YaSuenag/jvmti-examples
© 2020 NTT DATA Corporation 11
JVMTIエージェントを作る際のポイント
1. CとC++で書き方が違う
2. 1エージェント 1 JVMTI環境
3. 段階(フェーズ)を意識する
© 2020 NTT DATA Corporation 12
ポイント1:CとC++で書き方が違う
(*jvmti)->GetTime(jvmti, &value); jvmti->GetTime(&value);
C言語 C++
• JVMTI環境を逆参照する
• 第1引数にJVMTI環境を渡す
• 通常のメンバ関数呼び出し
JNIと同じ!
© 2020 NTT DATA Corporation 13
ポイント2:1エージェント 1 JVMTI環境
• JVMTIの機能へはJVMTI環境経由でアクセスする
• jvmtiEnv型
• すべてのJVMTI機能はJVMTI環境単位で管理される
• イベント、動的メモリ、権限…
• 基本的に1つのエージェントでは1つのJVMTI環境を利用する
• コールバックの二重フックやメモリリークなどの問題を避けるため
(*jvmti)->GetTime(jvmti, &value); jvmti->GetTime(&value);
© 2020 NTT DATA Corporation 14
ポイント2:段階(フェーズ)を意識する
• JVMTIのイベントや関数では、それが使える「段階」が存在する
• 各段階に応じて使える機能が違うので注意が必要
OnLoad段階 JVMが開始された直後の、JVMTIエージェントがロードされた段階
初期段階 JVMTIエージェントの初期化が完了し、JVMの初期化処理が始まる段階
開始段階 JVMの初期化中の段階
ライブ段階 動作中(アプリケーションが制限なく動作できる)段階
デッド段階 JVM終了の段階
© 2020 NTT DATA Corporation
JVMTIで
Hello World
© 2020 NTT DATA Corporation 16
概要
• エージェントの開始/終了時にコンソールにメッセージを出す
• 動的アタッチにも対応する
• オプション文字列に”error”が与えられたとき、エラーにする
• サンプルソース
• https://github.com/YaSuenag/jvmti-examples/tree/master/helloworld
エージェント
ロード
エージェント
アンロード
エージェント
アタッチ
© 2020 NTT DATA Corporation 17
エージェント開始時 ~プロセス起動時~
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options,
void *reserved){
printf("Hello World from Agent_OnLoad()n");
return is_error(options) ? JNI_ERR : JNI_OK;
}
エクスポート用
マクロ
呼び出し規約 コールバック関数
ゼロで成功、ゼロ以外で失敗
オプション文字列
• エージェント開始のフックはAgent_OnLoad()
• JVMTIエージェントに存在しなければならない関数
• ゼロ以外を返すと処理失敗とみなされ、JVMが起動しない
© 2020 NTT DATA Corporation 18
エージェント開始時 ~動的アタッチ~
JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM *vm, char *options,
void *reserved){
printf("Hello World from Agent_OnAttach()n");
return is_error(options) ? JNI_ERR : JNI_OK;
}
コールバック関数
• 途中から仕掛ける場合のフックはAgent_OnAttach()
• 必須ではないが、動的アタッチに対応するなら必要な関数
• ゼロ以外を返すと処理失敗とみなされ、エージェントが起動しない
• Agent_OnAttach()と違い、JVMは異常終了しない
© 2020 NTT DATA Corporation 19
エージェント終了時
JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm){
printf("Goodbye World from Agent_OnUnload()n");
}
• エージェント終了のフックはAgent_OnUnload()
• JVMTIエージェントに存在しなくてもよい関数
• JVMの終了後に呼び出されることに注意!
• ライブ段階を抜けているため、ほとんどのJVMTI関数が使えない
コールバック関数
© 2020 NTT DATA Corporation 20
ビルド
cmake_minimum_required(VERSION 3.0)
project(HelloWorld C)
find_package(JNI REQUIRED)
find_package(Threads REQUIRED)
include_directories(${JNI_INCLUDE_DIRS})
add_library(helloworld SHARED helloworld.c)
target_link_libraries(helloworld PRIVATE Threads::Threads)
• 作り次第ではクロスプラットフォームも可能
• マルチスレッド対応の共有ライブラリとしてビルドする
• JVMがマルチスレッド動作するため
© 2020 NTT DATA Corporation 21
実行
$ java -agentpath:/path/to/libhelloworld.so --version
Hello World from Agent_OnLoad()
openjdk 14.0.1 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+7-Ubuntu-1ubuntu1)
OpenJDK 64-Bit Server VM (build 14.0.1+7-Ubuntu-1ubuntu1, mixed mode, sharing)
Goodbye World from Agent_OnUnload()
$ export LD_LIBRARY_PATH=`pwd`
$ java -agentlib:helloworld --version
Hello World from Agent_OnLoad()
openjdk 14.0.1 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+7-Ubuntu-1ubuntu1)
OpenJDK 64-Bit Server VM (build 14.0.1+7-Ubuntu-1ubuntu1, mixed mode, sharing)
Goodbye World from Agent_OnUnload()
フルパス指定
ライブラリ名指定
(要LD_LIBRARY_PARH)
© 2020 NTT DATA Corporation 22
動的アタッチ
$ jcmd 2875 JVMTI.agent_load /path/to/libhelloworld.so
2875:
return code: 0
• JVMTI.agent_loadで動的にJVMTIエージェントをアタッチ
• 引数でライブラリを指定する
• ライブラリ指定はフルパスがオススメ
© 2020 NTT DATA Corporation 23
エラーの場合
$ java -agentpath:/path/to/libhelloworld.so=error --version
Hello World from Agent_OnLoad()
options = error
Error occurred during initialization of VM
agent library failed to init: /path/to/libhelloworld.so
$ jcmd 48 JVMTI.agent_load /path/to/libhelloworld.so error
48:
return code: -1
• 動的アタッチではプロセスは動作したまま
• エージェントは開始しないもののライブラリはロードされたまま(JDK-8252657)
-agentpath、-agentlibではプロセス異常終了
© 2020 NTT DATA Corporation
はじめての
イベントフック
© 2020 NTT DATA Corporation 25
概要
• OutOfMemoryErrorをフックし、コンソールに出力します
• ResourceExhaustedイベントを使います
• https://docs.oracle.com/javase/jp/14/docs/specs/jvmti.html#ResourceExhausted
• サンプルソース
• https://github.com/YaSuenag/jvmti-examples/tree/master/oomehook
エージェント
ロード
エージェント
アンロード
ResourceExhausted
エージェント
アタッチ
© 2020 NTT DATA Corporation 26
コードの流れ
① JVMTI環境を得る
② 権限を設定する
③ イベントコールバックを設定する
④ イベントを有効化する
© 2020 NTT DATA Corporation 27
①JVMTI環境を得る
• JavaVM::GetEnv()の仕様にJVMTIバージョンを与えて
jvmtiEnv型のポインタを取得する
• バージョン番号は使用する機能の導入されたバージョンから選択
jvmtiEnv *jvmti;
vm->GetEnv(reinterpret_cast<void **>(&jvmti), JVMTI_VERSION_1_1);
© 2020 NTT DATA Corporation 28
②権限を設定する
• 使用する関数やイベントで必要な権限を追加する
• 設定可能な権限はJVM実装や実行段階によって異なる
• 現在の権限の取得はGetCapabilities()
jvmtiCapabilities capabilities = {0};
capabilities.can_generate_resource_exhaustion_heap_events = 1;
jvmti->AddCapabilities(&capabilities);
© 2020 NTT DATA Corporation 29
③イベントコールバックを設定する
• コールバック関数を追加する
• 1つのJVMTI環境につきコールバックは1つしか設定できない
• 例:ResourceExhaustedは1環境に1つだけ設定可能
jvmtiEventCallbacks callbacks = {0};
callbacks.ResourceExhausted = &OnOutOfMemoryError;
jvmti->SetEventCallbacks(&callbacks, sizeof(callbacks));
© 2020 NTT DATA Corporation 30
④イベントを有効化する
• すべてのイベントはデフォルトで無効になっている
• JVMTIドキュメントの「有効化」(Enabling)を参照
jvmti->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_RESOURCE_EXHAUSTED, NULL);
© 2020 NTT DATA Corporation 31
実行例
$ ./run.sh /path/to/liboomehook.so
from JVMTI: OutOfMemoryError occurred: Java heap space
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at OOME.main(OOME.java:7)
© 2020 NTT DATA Corporation
応用編:
自家製GCログ
© 2020 NTT DATA Corporation 33
概要
• アプリケーション停止を伴うGCをフックし、コンソールに出力します
• GarbageCollection{Start,Finish}イベントを使います
• https://docs.oracle.com/javase/jp/14/docs/specs/jvmti.html#GarbageCollectionStart
• https://docs.oracle.com/javase/jp/14/docs/specs/jvmti.html#GarbageCollectionFinish
• サンプルソース
• https://github.com/YaSuenag/jvmti-examples/tree/master/gchook
エージェント
ロード
エージェント
アンロード
GarbageCollectionFinish
エージェント
アタッチ GarbageCollectionStart
© 2020 NTT DATA Corporation 34
GCイベントのワナ
GarbageCollectionFinishGarbageCollectionStart
アプリケーションスレッド停止区間
アプリケーション停止中にイベント発生!
© 2020 NTT DATA Corporation 35
実験:GC開始イベントで10秒スリープさせる
void JNICALL OnGarbageCollectionStart(jvmtiEnv *jvmti){
std::cout << "from JVMTI: GC start" << std::endl;
if(need_to_suspend){
std::cout
<< "from JVMTI: Sleep 10 secs in GarbageCollectionStart()...“
<< std::endl;
sleep(10);
std::cout << "from JVMTI: Resume from sleep" << std::endl;
}
}
© 2020 NTT DATA Corporation 36
実行例
[0.026s][info][safepoint] Entering safepoint region: G1CollectFull
from JVMTI: GC start
from JVMTI: Sleep 10 secs in GarbageCollectionStart()...
from JVMTI: Resume from sleep
[10.029s][info][gc ] GC(0) Pause Full (System.gc()) 1M->0M(10M) 2.236ms
from JVMTI: GC finish
[10.029s][info][safepoint] Leaving safepoint region
[10.029s][info][safepoint] Total time for which application threads were
stopped: 10.0037798 seconds, Stopping threads took: 0.0000045 seconds
• GC停止:2.2ミリ秒
• アプリケーション停止:10秒 ?
© 2020 NTT DATA Corporation 37
見る場所によって異なる”停止時間”
停止要求
アプリケーションスレッド停止
GarbageCollectionStart
GC
GarbageCollectionFinish
アプリケーション再開
GCによる停止時間
アプリケーションの停止時間
GCチューニングをどんなにガンバっても
JVMTIエージェントがそれを台無しにすることもある!
© 2020 NTT DATA Corporation 38
では、どうすればいいか?
別スレッドで動かす!
© 2020 NTT DATA Corporation 39
GCイベントとマルチスレッド
GCワーカー JVMTIのスレッド
停止要求
アプリケーションスレッド停止
GarbageCollectionStart
GC
GarbageCollectionFinish
アプリケーション再開
GCによる停止時間
アプリケーションの停止時間
ロック通知待ち…
処理
© 2020 NTT DATA Corporation 40
注意
• GCワーカーと並行して動く
• アプリケーション完全停止中でも動き回れる
• Javaヒープを触った瞬間にGCによる完全停止に巻き込まれる!
jvmti->RawMonitorWait(monitor, 0L); // GCイベントからの通知待ち
std::cout << "from JVMTI agent thread" << std::endl;
env->NewStringUTF(“Access Java heap”); // 新しい文字列を作る
std::cout << "from JVMTI agent thread: continue" << std::endl;
© 2020 NTT DATA Corporation
まとめ
© 2020 NTT DATA Corporation 42
まとめ
• JVMTI:デバッグや監視に使えるイベントドリブンな共有ライブラリ
• イベントの種類やイベントハンドラの書き方によっては
アプリケーション性能へ甚大な影響を与えるため注意が必要
• 必要なイベントを見極めて、可能な限り軽量なロジックを作る!
© 2020 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です

Weitere ähnliche Inhalte

Was ist angesagt?

PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説Masahiko Sawada
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)NTT DATA Technology & Innovation
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)NTT DATA Technology & Innovation
 
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)NTT DATA Technology & Innovation
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...NTT DATA Technology & Innovation
 
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)NTT DATA Technology & Innovation
 
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)NTT DATA Technology & Innovation
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)NTT DATA Technology & Innovation
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
カスタムプランと汎用プラン
カスタムプランと汎用プランカスタムプランと汎用プラン
カスタムプランと汎用プランMasao Fujii
 
並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャKohei KaiGai
 
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)NTT DATA Technology & Innovation
 
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)NTT DATA Technology & Innovation
 
Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Masahiko Sawada
 

Was ist angesagt? (20)

PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
 
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
 
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
 
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
 
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
カスタムプランと汎用プラン
カスタムプランと汎用プランカスタムプランと汎用プラン
カスタムプランと汎用プラン
 
PostgreSQLコミュニティに飛び込もう
PostgreSQLコミュニティに飛び込もうPostgreSQLコミュニティに飛び込もう
PostgreSQLコミュニティに飛び込もう
 
並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
 
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
 
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)
 
Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会
 

Ähnlich wie JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)

GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)NTT DATA Technology & Innovation
 
HeapStats: Introduction and Technical Preview
HeapStats: Introduction and Technical PreviewHeapStats: Introduction and Technical Preview
HeapStats: Introduction and Technical PreviewYuji Kubota
 
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTYuji Kubota
 
"Up" with vagrant and docker
"Up" with vagrant and docker"Up" with vagrant and docker
"Up" with vagrant and dockerHiroshi Miura
 
openstackの仮想マシンHA機能の現状と今後の方向性
openstackの仮想マシンHA機能の現状と今後の方向性openstackの仮想マシンHA機能の現状と今後の方向性
openstackの仮想マシンHA機能の現状と今後の方向性Sampath Priyankara
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)NTT DATA Technology & Innovation
 
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...Shinji Takao
 
"Up" with vagrant and docker
"Up" with vagrant and docker"Up" with vagrant and docker
"Up" with vagrant and dockerHiroshi Miura
 
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)NTT DATA Technology & Innovation
 
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 EastiOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 Eastirgaly
 
JJUGナイトセミナー OpenJDK祭り「OpenJ9+OpenJDK」
JJUGナイトセミナー OpenJDK祭り「OpenJ9+OpenJDK」JJUGナイトセミナー OpenJDK祭り「OpenJ9+OpenJDK」
JJUGナイトセミナー OpenJDK祭り「OpenJ9+OpenJDK」Takakiyo Tanaka
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPAkawaba
 
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組みJJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み日本Javaユーザーグループ
 
loggregator update
loggregator updateloggregator update
loggregator updateKen Ojiri
 
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~Shinji Takao
 
JavaOne 2015 JDK Update (Jigsaw) #j1jp
JavaOne 2015 JDK Update (Jigsaw) #j1jpJavaOne 2015 JDK Update (Jigsaw) #j1jp
JavaOne 2015 JDK Update (Jigsaw) #j1jpYuji Kubota
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)JPCERT Coordination Center
 
RTミドルウエア講習会2015
RTミドルウエア講習会2015RTミドルウエア講習会2015
RTミドルウエア講習会2015Yuki Suga
 
今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集Wataru NOGUCHI
 
JavaOne 2016 Java SE Feedback #jjug #j1jp
JavaOne 2016 Java SE Feedback #jjug #j1jpJavaOne 2016 Java SE Feedback #jjug #j1jp
JavaOne 2016 Java SE Feedback #jjug #j1jpYuji Kubota
 

Ähnlich wie JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料) (20)

GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
 
HeapStats: Introduction and Technical Preview
HeapStats: Introduction and Technical PreviewHeapStats: Introduction and Technical Preview
HeapStats: Introduction and Technical Preview
 
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
 
"Up" with vagrant and docker
"Up" with vagrant and docker"Up" with vagrant and docker
"Up" with vagrant and docker
 
openstackの仮想マシンHA機能の現状と今後の方向性
openstackの仮想マシンHA機能の現状と今後の方向性openstackの仮想マシンHA機能の現状と今後の方向性
openstackの仮想マシンHA機能の現状と今後の方向性
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
 
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
 
"Up" with vagrant and docker
"Up" with vagrant and docker"Up" with vagrant and docker
"Up" with vagrant and docker
 
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
 
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 EastiOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
 
JJUGナイトセミナー OpenJDK祭り「OpenJ9+OpenJDK」
JJUGナイトセミナー OpenJDK祭り「OpenJ9+OpenJDK」JJUGナイトセミナー OpenJDK祭り「OpenJ9+OpenJDK」
JJUGナイトセミナー OpenJDK祭り「OpenJ9+OpenJDK」
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPA
 
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組みJJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
 
loggregator update
loggregator updateloggregator update
loggregator update
 
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
 
JavaOne 2015 JDK Update (Jigsaw) #j1jp
JavaOne 2015 JDK Update (Jigsaw) #j1jpJavaOne 2015 JDK Update (Jigsaw) #j1jp
JavaOne 2015 JDK Update (Jigsaw) #j1jp
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
 
RTミドルウエア講習会2015
RTミドルウエア講習会2015RTミドルウエア講習会2015
RTミドルウエア講習会2015
 
今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集
 
JavaOne 2016 Java SE Feedback #jjug #j1jp
JavaOne 2016 Java SE Feedback #jjug #j1jpJavaOne 2016 Java SE Feedback #jjug #j1jp
JavaOne 2016 Java SE Feedback #jjug #j1jp
 

Mehr von NTT DATA Technology & Innovation

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)NTT DATA Technology & Innovation
 
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方NTT DATA Technology & Innovation
 
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...NTT DATA Technology & Innovation
 
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)NTT DATA Technology & Innovation
 
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)NTT DATA Technology & Innovation
 
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...NTT DATA Technology & Innovation
 
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)NTT DATA Technology & Innovation
 
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)NTT DATA Technology & Innovation
 
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)NTT DATA Technology & Innovation
 
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)NTT DATA Technology & Innovation
 
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...NTT DATA Technology & Innovation
 
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)NTT DATA Technology & Innovation
 
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)NTT DATA Technology & Innovation
 
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)NTT DATA Technology & Innovation
 
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...NTT DATA Technology & Innovation
 
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)NTT DATA Technology & Innovation
 
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)NTT DATA Technology & Innovation
 
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 

Mehr von NTT DATA Technology & Innovation (20)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
 
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
 
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
 
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
 
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
 
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
 
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
 
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
 
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
 
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
 
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
 
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
 
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
 
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
 
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
 
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
 
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
 
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
 

Kürzlich hochgeladen

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 

Kürzlich hochgeladen (6)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)

  • 1. © 2020 NTT DATA Corporation JVMに裏から手を出す! JVMTIに触れてみよう 2020年9月19日 株式会社NTTデータ 技術開発本部 末永 恭正 オープンソースカンファレンス2020 Online/Hiroshima
  • 2. © 2020 NTT DATA Corporation 2 自己紹介 • 末永 恭正 • NTTデータ 技術革新統括本部 • OpenJDK Reviewer YaSuenag
  • 3. © 2020 NTT DATA Corporation 3 本日のテーマ Java Virtual Machine Tool Interface Java仮想マシンが備える Javaのデバッグや監視に便利な インターフェース(API)
  • 4. © 2020 NTT DATA Corporation 4 https://docs.oracle.com/javase/jp/14/ https://docs.oracle.com/javase/jp/14/docs/specs/jvmti.html
  • 5. © 2020 NTT DATA Corporation 5 JVMTI • APIインターフェース:C/C++ • JNI+αなイメージ • メソッド呼び出しなど、JNIもよく使います • 共有ライブラリ形式のイベントドリブンなエージェントプログラム • 2つの開始タイミング(プロセス同期、動的アタッチ) • 機能 • JVM内部イベントのフック • クラス書き換え • オブジェクト参照関係の追跡 など
  • 6. © 2020 NTT DATA Corporation 6 イベントドリブン エージェント ロード JVM開始 JVM終了 エージェント アンロード スレッド開始 クラスロード GC 例外発生 メソッド実行 エージェント アタッチ … • JVMの内部では様々なイベントが飛び交っている! • JVMのライフサイクルの中で様々なイベントが発生 • イベントをどう捌くかがJVMTIエージェントのキモ! • イベントを拾いすぎたり、ハンドラが重いとアプリケーションへ悪影響
  • 7. © 2020 NTT DATA Corporation 7 JVMTIエージェントを作る、ということ + JVM実装固有 イベント JVMTI定義イベント やりたいことのトリガとなるイベントを見つけて できるだけ軽い動作をさせる!
  • 8. © 2020 NTT DATA Corporation 8 実は身近!?JVMTIの利用例 • IDE、エディタのデバッガの足廻り • Java Debugger Interface(JDI) • EclipseやVS Codeなどで使われる、ポピュラーなもの • Java Flight Recorder • Java 11からOSS化された軽量なプロファイラ • クラス情報を差し替えるためJVMが内部的に利用 • HeapStats • メモリトラブル早期解決を助けるOSSの監視ツール • GC動作状況やメモリ不足発生をリアルタイムに把握
  • 9. © 2020 NTT DATA Corporation サンプルで理解する JVMTI
  • 10. © 2020 NTT DATA Corporation 10 3つのサンプル 1. Hello World • JVMTIエージェントの開始/終了を体験する • 2つの開始タイミングを体験する 2. はじめてのイベントフック • JVM内部イベントのフックを体験する • JVMの実行フェーズ、JVMTI機能の実行に必要な権限を 理解する 3. 自家製GCログ • JVMTIを活用した独自のロギング機能を作成する • JVMTIエージェントがJVMの挙動に与える影響を体験する https://github.com/YaSuenag/jvmti-examples
  • 11. © 2020 NTT DATA Corporation 11 JVMTIエージェントを作る際のポイント 1. CとC++で書き方が違う 2. 1エージェント 1 JVMTI環境 3. 段階(フェーズ)を意識する
  • 12. © 2020 NTT DATA Corporation 12 ポイント1:CとC++で書き方が違う (*jvmti)->GetTime(jvmti, &value); jvmti->GetTime(&value); C言語 C++ • JVMTI環境を逆参照する • 第1引数にJVMTI環境を渡す • 通常のメンバ関数呼び出し JNIと同じ!
  • 13. © 2020 NTT DATA Corporation 13 ポイント2:1エージェント 1 JVMTI環境 • JVMTIの機能へはJVMTI環境経由でアクセスする • jvmtiEnv型 • すべてのJVMTI機能はJVMTI環境単位で管理される • イベント、動的メモリ、権限… • 基本的に1つのエージェントでは1つのJVMTI環境を利用する • コールバックの二重フックやメモリリークなどの問題を避けるため (*jvmti)->GetTime(jvmti, &value); jvmti->GetTime(&value);
  • 14. © 2020 NTT DATA Corporation 14 ポイント2:段階(フェーズ)を意識する • JVMTIのイベントや関数では、それが使える「段階」が存在する • 各段階に応じて使える機能が違うので注意が必要 OnLoad段階 JVMが開始された直後の、JVMTIエージェントがロードされた段階 初期段階 JVMTIエージェントの初期化が完了し、JVMの初期化処理が始まる段階 開始段階 JVMの初期化中の段階 ライブ段階 動作中(アプリケーションが制限なく動作できる)段階 デッド段階 JVM終了の段階
  • 15. © 2020 NTT DATA Corporation JVMTIで Hello World
  • 16. © 2020 NTT DATA Corporation 16 概要 • エージェントの開始/終了時にコンソールにメッセージを出す • 動的アタッチにも対応する • オプション文字列に”error”が与えられたとき、エラーにする • サンプルソース • https://github.com/YaSuenag/jvmti-examples/tree/master/helloworld エージェント ロード エージェント アンロード エージェント アタッチ
  • 17. © 2020 NTT DATA Corporation 17 エージェント開始時 ~プロセス起動時~ JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved){ printf("Hello World from Agent_OnLoad()n"); return is_error(options) ? JNI_ERR : JNI_OK; } エクスポート用 マクロ 呼び出し規約 コールバック関数 ゼロで成功、ゼロ以外で失敗 オプション文字列 • エージェント開始のフックはAgent_OnLoad() • JVMTIエージェントに存在しなければならない関数 • ゼロ以外を返すと処理失敗とみなされ、JVMが起動しない
  • 18. © 2020 NTT DATA Corporation 18 エージェント開始時 ~動的アタッチ~ JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM *vm, char *options, void *reserved){ printf("Hello World from Agent_OnAttach()n"); return is_error(options) ? JNI_ERR : JNI_OK; } コールバック関数 • 途中から仕掛ける場合のフックはAgent_OnAttach() • 必須ではないが、動的アタッチに対応するなら必要な関数 • ゼロ以外を返すと処理失敗とみなされ、エージェントが起動しない • Agent_OnAttach()と違い、JVMは異常終了しない
  • 19. © 2020 NTT DATA Corporation 19 エージェント終了時 JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm){ printf("Goodbye World from Agent_OnUnload()n"); } • エージェント終了のフックはAgent_OnUnload() • JVMTIエージェントに存在しなくてもよい関数 • JVMの終了後に呼び出されることに注意! • ライブ段階を抜けているため、ほとんどのJVMTI関数が使えない コールバック関数
  • 20. © 2020 NTT DATA Corporation 20 ビルド cmake_minimum_required(VERSION 3.0) project(HelloWorld C) find_package(JNI REQUIRED) find_package(Threads REQUIRED) include_directories(${JNI_INCLUDE_DIRS}) add_library(helloworld SHARED helloworld.c) target_link_libraries(helloworld PRIVATE Threads::Threads) • 作り次第ではクロスプラットフォームも可能 • マルチスレッド対応の共有ライブラリとしてビルドする • JVMがマルチスレッド動作するため
  • 21. © 2020 NTT DATA Corporation 21 実行 $ java -agentpath:/path/to/libhelloworld.so --version Hello World from Agent_OnLoad() openjdk 14.0.1 2020-04-14 OpenJDK Runtime Environment (build 14.0.1+7-Ubuntu-1ubuntu1) OpenJDK 64-Bit Server VM (build 14.0.1+7-Ubuntu-1ubuntu1, mixed mode, sharing) Goodbye World from Agent_OnUnload() $ export LD_LIBRARY_PATH=`pwd` $ java -agentlib:helloworld --version Hello World from Agent_OnLoad() openjdk 14.0.1 2020-04-14 OpenJDK Runtime Environment (build 14.0.1+7-Ubuntu-1ubuntu1) OpenJDK 64-Bit Server VM (build 14.0.1+7-Ubuntu-1ubuntu1, mixed mode, sharing) Goodbye World from Agent_OnUnload() フルパス指定 ライブラリ名指定 (要LD_LIBRARY_PARH)
  • 22. © 2020 NTT DATA Corporation 22 動的アタッチ $ jcmd 2875 JVMTI.agent_load /path/to/libhelloworld.so 2875: return code: 0 • JVMTI.agent_loadで動的にJVMTIエージェントをアタッチ • 引数でライブラリを指定する • ライブラリ指定はフルパスがオススメ
  • 23. © 2020 NTT DATA Corporation 23 エラーの場合 $ java -agentpath:/path/to/libhelloworld.so=error --version Hello World from Agent_OnLoad() options = error Error occurred during initialization of VM agent library failed to init: /path/to/libhelloworld.so $ jcmd 48 JVMTI.agent_load /path/to/libhelloworld.so error 48: return code: -1 • 動的アタッチではプロセスは動作したまま • エージェントは開始しないもののライブラリはロードされたまま(JDK-8252657) -agentpath、-agentlibではプロセス異常終了
  • 24. © 2020 NTT DATA Corporation はじめての イベントフック
  • 25. © 2020 NTT DATA Corporation 25 概要 • OutOfMemoryErrorをフックし、コンソールに出力します • ResourceExhaustedイベントを使います • https://docs.oracle.com/javase/jp/14/docs/specs/jvmti.html#ResourceExhausted • サンプルソース • https://github.com/YaSuenag/jvmti-examples/tree/master/oomehook エージェント ロード エージェント アンロード ResourceExhausted エージェント アタッチ
  • 26. © 2020 NTT DATA Corporation 26 コードの流れ ① JVMTI環境を得る ② 権限を設定する ③ イベントコールバックを設定する ④ イベントを有効化する
  • 27. © 2020 NTT DATA Corporation 27 ①JVMTI環境を得る • JavaVM::GetEnv()の仕様にJVMTIバージョンを与えて jvmtiEnv型のポインタを取得する • バージョン番号は使用する機能の導入されたバージョンから選択 jvmtiEnv *jvmti; vm->GetEnv(reinterpret_cast<void **>(&jvmti), JVMTI_VERSION_1_1);
  • 28. © 2020 NTT DATA Corporation 28 ②権限を設定する • 使用する関数やイベントで必要な権限を追加する • 設定可能な権限はJVM実装や実行段階によって異なる • 現在の権限の取得はGetCapabilities() jvmtiCapabilities capabilities = {0}; capabilities.can_generate_resource_exhaustion_heap_events = 1; jvmti->AddCapabilities(&capabilities);
  • 29. © 2020 NTT DATA Corporation 29 ③イベントコールバックを設定する • コールバック関数を追加する • 1つのJVMTI環境につきコールバックは1つしか設定できない • 例:ResourceExhaustedは1環境に1つだけ設定可能 jvmtiEventCallbacks callbacks = {0}; callbacks.ResourceExhausted = &OnOutOfMemoryError; jvmti->SetEventCallbacks(&callbacks, sizeof(callbacks));
  • 30. © 2020 NTT DATA Corporation 30 ④イベントを有効化する • すべてのイベントはデフォルトで無効になっている • JVMTIドキュメントの「有効化」(Enabling)を参照 jvmti->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_RESOURCE_EXHAUSTED, NULL);
  • 31. © 2020 NTT DATA Corporation 31 実行例 $ ./run.sh /path/to/liboomehook.so from JVMTI: OutOfMemoryError occurred: Java heap space Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at OOME.main(OOME.java:7)
  • 32. © 2020 NTT DATA Corporation 応用編: 自家製GCログ
  • 33. © 2020 NTT DATA Corporation 33 概要 • アプリケーション停止を伴うGCをフックし、コンソールに出力します • GarbageCollection{Start,Finish}イベントを使います • https://docs.oracle.com/javase/jp/14/docs/specs/jvmti.html#GarbageCollectionStart • https://docs.oracle.com/javase/jp/14/docs/specs/jvmti.html#GarbageCollectionFinish • サンプルソース • https://github.com/YaSuenag/jvmti-examples/tree/master/gchook エージェント ロード エージェント アンロード GarbageCollectionFinish エージェント アタッチ GarbageCollectionStart
  • 34. © 2020 NTT DATA Corporation 34 GCイベントのワナ GarbageCollectionFinishGarbageCollectionStart アプリケーションスレッド停止区間 アプリケーション停止中にイベント発生!
  • 35. © 2020 NTT DATA Corporation 35 実験:GC開始イベントで10秒スリープさせる void JNICALL OnGarbageCollectionStart(jvmtiEnv *jvmti){ std::cout << "from JVMTI: GC start" << std::endl; if(need_to_suspend){ std::cout << "from JVMTI: Sleep 10 secs in GarbageCollectionStart()...“ << std::endl; sleep(10); std::cout << "from JVMTI: Resume from sleep" << std::endl; } }
  • 36. © 2020 NTT DATA Corporation 36 実行例 [0.026s][info][safepoint] Entering safepoint region: G1CollectFull from JVMTI: GC start from JVMTI: Sleep 10 secs in GarbageCollectionStart()... from JVMTI: Resume from sleep [10.029s][info][gc ] GC(0) Pause Full (System.gc()) 1M->0M(10M) 2.236ms from JVMTI: GC finish [10.029s][info][safepoint] Leaving safepoint region [10.029s][info][safepoint] Total time for which application threads were stopped: 10.0037798 seconds, Stopping threads took: 0.0000045 seconds • GC停止:2.2ミリ秒 • アプリケーション停止:10秒 ?
  • 37. © 2020 NTT DATA Corporation 37 見る場所によって異なる”停止時間” 停止要求 アプリケーションスレッド停止 GarbageCollectionStart GC GarbageCollectionFinish アプリケーション再開 GCによる停止時間 アプリケーションの停止時間 GCチューニングをどんなにガンバっても JVMTIエージェントがそれを台無しにすることもある!
  • 38. © 2020 NTT DATA Corporation 38 では、どうすればいいか? 別スレッドで動かす!
  • 39. © 2020 NTT DATA Corporation 39 GCイベントとマルチスレッド GCワーカー JVMTIのスレッド 停止要求 アプリケーションスレッド停止 GarbageCollectionStart GC GarbageCollectionFinish アプリケーション再開 GCによる停止時間 アプリケーションの停止時間 ロック通知待ち… 処理
  • 40. © 2020 NTT DATA Corporation 40 注意 • GCワーカーと並行して動く • アプリケーション完全停止中でも動き回れる • Javaヒープを触った瞬間にGCによる完全停止に巻き込まれる! jvmti->RawMonitorWait(monitor, 0L); // GCイベントからの通知待ち std::cout << "from JVMTI agent thread" << std::endl; env->NewStringUTF(“Access Java heap”); // 新しい文字列を作る std::cout << "from JVMTI agent thread: continue" << std::endl;
  • 41. © 2020 NTT DATA Corporation まとめ
  • 42. © 2020 NTT DATA Corporation 42 まとめ • JVMTI:デバッグや監視に使えるイベントドリブンな共有ライブラリ • イベントの種類やイベントハンドラの書き方によっては アプリケーション性能へ甚大な影響を与えるため注意が必要 • 必要なイベントを見極めて、可能な限り軽量なロジックを作る!
  • 43. © 2020 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です