SlideShare a Scribd company logo
1 of 36
Download to read offline
2018年12月15日
数村 憲治
GCを発生させない
JVMとコーディングスタイル
Copyright 2018 FUJITSU LIMITED0
JJUG CCC 2018 Fall
.setName(“数村憲治”)
.setDirectorOf(“Eclipse Foundation Board”)
.setMemberOf(“Jakarta EE Committee”)
.setMemberOf(“JCP Executive Committee”)
.setTwitter(“@kkzr”)
.setResponsibleFor(“Launcher”)
.build();
スピーカー
Copyright 2018 FUJITSU LIMITED
Speaker me = SpeakerBuilder
1
アジェンダ
Copyright 2018 FUJITSU LIMITED
GC問題
アプリケーションによる対処
コンパイラによる対処
サマリ
2
アジェンダ
Copyright 2018 FUJITSU LIMITED
GC問題
アプリケーションによる対処
コンパイラによる対処
サマリ
3
何が問題か
Copyright 2018 FUJITSU LIMITED
健康診断シンドローム
アプリケーションの実行が止まる
アプリケーションに割り当てられるCPU時間が減る
実はたいした問題ではない
4
スループット
レスポンス
なぜ問題か
Copyright 2018 FUJITSU LIMITED
(Cでは、malloc/free回数に依存)
チューニングがたいへん
最適解をみつけるのが難しい
環境が変わるとやりなおし
見積もりができない
GC時間は残存オブジェクトに依存
5
問題の対処方法
Copyright 2018 FUJITSU LIMITED
あきらめる SLAの妥協
Javaを使わない
オブジェクトの
生成数・量を減らす
アプリケーションで頑張る
GCで頑張る
コンパイラで頑張る
優秀なGCを作る
オブジェクトの
生成を最適化
6
デモ
Copyright 2018 FUJITSU LIMITED7
Node.js
$ node –trace-gc node.js
$ graalvm-ce-1.0.0-rc10/bin/node --jvm.Xmx16m --jvm.Xms16m --jvm.verbose:gc node.js
アジェンダ
Copyright 2018 FUJITSU LIMITED
GC問題
アプリケーションによる対処
コンパイラによる対処
サマリ
8
アプリケーションで頑張る
Copyright 2018 FUJITSU LIMITED
オブジェクトプール (キャッシュ)
スレッドプール
コネクションプール
小ネタ
ArrayList 拡張
String.intern()
Boxing/Unboxing
9
Integer AutoBoxing
Copyright 2018 FUJITSU LIMITED10
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
キャッシュの範囲はプロパティで指定可能
java.lang.Integer.IntegerCache.high
よく使われる範囲はIntegerオブジェクトの使いまわし
Integer.java
プーリングコスト
Copyright 2018 FUJITSU LIMITED
1*(メモリ割当+初期化) + p*GCp
n*(メモリ割当+初期化) + u*GCu
プーリング使用時
プーリング不使用時
n: トランザクション回数
p: プーリング使用時のGC回数
u: プーリング不使用時のGC回数
GCp: プーリング使用時の1回のGC時間
GCu: プーリング不使用時の1回のGC時間
p < u
GCp > GCu
初期化 < n*初期化
メモリ割当は問題にならない
11
一般的な傾向
Edenからのアロケーション
Copyright 2018 FUJITSU LIMITED
o = new Object();
bottom top end
lock(Eden);
top = top + size;
unlock(Eden);
Bump The Pointer
bottom top end
12
size
TLAB (Thread-Local Allocation Buffer)
Copyright 2018 FUJITSU LIMITED
スレッド1スレッド2
Eden領域をスレッドごとに分割して割当て
ロックが不要に
13
lock(Eden);
top = top + size;
unlock(Eden);
Fast Allocation
Copyright 2018 FUJITSU LIMITED
https://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf
only requiring around 10 native instructions
Memory Management in the Java
HotSpot Virtual Machine
Bump the Pointer + TLAB で実現
14
デモ
Copyright 2018 FUJITSU LIMITED15
Bump The Pointer
$ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp -XX:CompileCommand=compileonly,Bump.doIt -XX:-UseTLAB Bump
$ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp -XX:CompileCommand=compileonly,Bump.doIt Bump
(注)PrintAssemblyを使うには、hsdisが必要。https://github.com/liuzhengyang/hsdis
TLABが向かないケース
Copyright 2018 FUJITSU LIMITED
スレッド N+1 用のTLABが割当てられない
スレッド1スレッド2 スレッドN
・・・
スレッド数が多く、かつ、オブジェクト生成量が少ない場合
16
デモ
Copyright 2018 FUJITSU LIMITED17
Thread-Local Allocation Buffer
$ java -Xmx32m -Xms32m -verbose:gc TLAB
$ java -Xmx32m -Xms32m -verbose:gc -XX:-UseTLAB TLAB
アジェンダ
Copyright 2018 FUJITSU LIMITED
GC問題
アプリケーションによる対処
コンパイラによる対処
サマリ
18
デモ
Copyright 2018 FUJITSU LIMITED19
メモリアロケーション量とGC頻度
$ java -Xmx32m -Xms32m -verbose:gc EA
Escape Analysis (EA)
Copyright 2018 FUJITSU LIMITED
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/performance-
enhancements-7.html
JDK 6 (HotSpot C2) から採用
JITによる最適化
Scalar Replacement
Stack Allocation
Lock Elision
20
Escapeとは
Copyright 2018 FUJITSU LIMITED
メソッドからの脱出
オブジェクトがアロケートされたメソッドの外で
使用されているかもしれない
オブジェクトはメソッドローカルでない
スレッドからの脱出
オブジェクトがアロケートされたスレッドの外で
使用されているかもしれない
他のスレッドがそのオブジェクトにアクセスするかもしれない
21
Escapeの種類
Copyright 2018 FUJITSU LIMITED
オブジェクトはグローバルに脱出する
オブジェクトは作成したメソッドを脱出しない
オブジェクトは引数経由でメソッドを脱出するが、
スレッドは脱出しない
NoEscape
ArgEscape
GlobalEscape
22
Escapeの例
Copyright 2018 FUJITSU LIMITED
int foo(String name) {
Person person = new Person(name);
return person.id();
}
void foo(String name) {
Person person = new Person(name);
register(person);
}
NoEscape
ArgEscape
23
Escapeの例
Copyright 2018 FUJITSU LIMITED
class bar {
Person person;
void foo(String name) {
person = new Person(name);
}
}
GlobalEscape
24
最適化の組み合わせ
Copyright 2018 FUJITSU LIMITED
Scalar
Replacement
Stack
Allocation
Lock
Elision
No
Escape 〇 〇 〇
Arg
Escape - - 〇
Global
Escape - - -
25
Stack Allocation
Copyright 2018 FUJITSU LIMITED
オブジェクトをヒープではなくスタックにアロケートする
メソッド終了と同時にオブジェクトは解放
HotSpotでは不採用
26
Stack Allocation
Copyright 2018 FUJITSU LIMITED
ヘッダ
32
山田
太郎
SP
メソッド
開始時
new Person()
実行後
メソッド
終了時
残骸
SP
SP
27
void foo {
Person person = new Person(32, “山田太郎”);
・・・
スタック
Scalar Replacement
Copyright 2018 FUJITSU LIMITED
オブジェクトフィールドへのアクセスを、
スタックまたはレジスターアクセスにする
Stack Allocationとは異なり、
オブジェクトヘッダー等はアロケートされない
28
Scalar Replacement 例
Copyright 2018 FUJITSU LIMITED
int foo(String name, int age) {
Person person = new Person(name, age);
return person.getAge();
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
29
デモ
Copyright 2018 FUJITSU LIMITED30
Scalar Replacement
$ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=print,ScalarReplace.doIt -XX:-DoEscapeAnalysis ScalarReplace
$ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=print,ScalarReplace.doIt -XX:+DoEscapeAnalysis ScalarReplace
$ java -verbose:gc -Xmx32m -Xms32m -XX:CompileCommand=dontinline,ScalarReplace.getPersonId ScalarReplace
Lock Elision
Copyright 2018 FUJITSU LIMITED
スレッドローカルなオブジェクトに対するロックを削除
31
void foo() {
Object lock = new Ojbect();
synchronized (lock) {
//doSomething
};
}
アジェンダ
Copyright 2018 FUJITSU LIMITED
GC問題
アプリケーションによる対処
コンパイラによる対処
サマリ
32
サマリ
Copyright 2018 FUJITSU LIMITED
GCの問題と対処
JVMの種類やインライン状況によっては、
GCが発生したり、しなかったり
33
まずは、見やすいコードを
GCは日々改善されている
Javaのアロケーションコストは低い
EAによるメモリ最適化もあり
Copyright 2018 FUJITSU LIMITED
Q/A
34
GCを発生させないJVMとコーディングスタイル

More Related Content

What's hot

ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりました
ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりましたジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりました
ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりましたYukiya Hayashi
 
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話MicroAd, Inc.(Engineer)
 
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)NTT DATA Technology & Innovation
 
Java によるクラウドネイティブ の実現に向けて
Java によるクラウドネイティブ の実現に向けてJava によるクラウドネイティブ の実現に向けて
Java によるクラウドネイティブ の実現に向けてShigeru Tatsuta
 
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)NTT DATA Technology & Innovation
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5Takahiro YAMADA
 
開発者の生産性向上を妨げる障壁と サイボウズの生産性向上チームの取り組み
開発者の生産性向上を妨げる障壁とサイボウズの生産性向上チームの取り組み開発者の生産性向上を妨げる障壁とサイボウズの生産性向上チームの取り組み
開発者の生産性向上を妨げる障壁と サイボウズの生産性向上チームの取り組みJumpei Miyata
 
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~Shinji Takao
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
コロナ禍で挑んだ超高速アジャイル開発 ~最速1.5ヶ月でローンチしたおでかけ混雑マップの舞台裏 (技術編) ~(NTTデータ テクノロジーカンファレンス ...
コロナ禍で挑んだ超高速アジャイル開発 ~最速1.5ヶ月でローンチしたおでかけ混雑マップの舞台裏 (技術編) ~(NTTデータ テクノロジーカンファレンス ...コロナ禍で挑んだ超高速アジャイル開発 ~最速1.5ヶ月でローンチしたおでかけ混雑マップの舞台裏 (技術編) ~(NTTデータ テクノロジーカンファレンス ...
コロナ禍で挑んだ超高速アジャイル開発 ~最速1.5ヶ月でローンチしたおでかけ混雑マップの舞台裏 (技術編) ~(NTTデータ テクノロジーカンファレンス ...NTT DATA Technology & Innovation
 
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?ichirin2501
 
Java でつくる 低レイテンシ実装の技巧
Java でつくる低レイテンシ実装の技巧Java でつくる低レイテンシ実装の技巧
Java でつくる 低レイテンシ実装の技巧 Ryosuke Yamazaki
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~Daisuke Morishita
 
アジャイルメトリクス実践ガイド
アジャイルメトリクス実践ガイドアジャイルメトリクス実践ガイド
アジャイルメトリクス実践ガイドHiroyuki Ito
 

What's hot (20)

Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
 
ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりました
ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりましたジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりました
ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりました
 
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
 
KafkaとPulsar
KafkaとPulsarKafkaとPulsar
KafkaとPulsar
 
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
 
Java によるクラウドネイティブ の実現に向けて
Java によるクラウドネイティブ の実現に向けてJava によるクラウドネイティブ の実現に向けて
Java によるクラウドネイティブ の実現に向けて
 
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
 
Kafka・Storm・ZooKeeperの認証と認可について #kafkajp
Kafka・Storm・ZooKeeperの認証と認可について #kafkajpKafka・Storm・ZooKeeperの認証と認可について #kafkajp
Kafka・Storm・ZooKeeperの認証と認可について #kafkajp
 
Metaspace
MetaspaceMetaspace
Metaspace
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
 
Yahoo! ニュースにおける ドキュメント管理の事例紹介
Yahoo! ニュースにおけるドキュメント管理の事例紹介Yahoo! ニュースにおけるドキュメント管理の事例紹介
Yahoo! ニュースにおける ドキュメント管理の事例紹介
 
開発者の生産性向上を妨げる障壁と サイボウズの生産性向上チームの取り組み
開発者の生産性向上を妨げる障壁とサイボウズの生産性向上チームの取り組み開発者の生産性向上を妨げる障壁とサイボウズの生産性向上チームの取り組み
開発者の生産性向上を妨げる障壁と サイボウズの生産性向上チームの取り組み
 
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
コロナ禍で挑んだ超高速アジャイル開発 ~最速1.5ヶ月でローンチしたおでかけ混雑マップの舞台裏 (技術編) ~(NTTデータ テクノロジーカンファレンス ...
コロナ禍で挑んだ超高速アジャイル開発 ~最速1.5ヶ月でローンチしたおでかけ混雑マップの舞台裏 (技術編) ~(NTTデータ テクノロジーカンファレンス ...コロナ禍で挑んだ超高速アジャイル開発 ~最速1.5ヶ月でローンチしたおでかけ混雑マップの舞台裏 (技術編) ~(NTTデータ テクノロジーカンファレンス ...
コロナ禍で挑んだ超高速アジャイル開発 ~最速1.5ヶ月でローンチしたおでかけ混雑マップの舞台裏 (技術編) ~(NTTデータ テクノロジーカンファレンス ...
 
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
 
Java でつくる 低レイテンシ実装の技巧
Java でつくる低レイテンシ実装の技巧Java でつくる低レイテンシ実装の技巧
Java でつくる 低レイテンシ実装の技巧
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
 
アジャイルメトリクス実践ガイド
アジャイルメトリクス実践ガイドアジャイルメトリクス実践ガイド
アジャイルメトリクス実践ガイド
 

Similar to GCを発生させないJVMとコーディングスタイル

Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要Chihiro Ito
 
【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた
【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた
【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみたYuya Ohara
 
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
 
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -Yahoo!デベロッパーネットワーク
 
Microprofileでエンタープライズ品質
Microprofileでエンタープライズ品質Microprofileでエンタープライズ品質
Microprofileでエンタープライズ品質Kenji Kazumura
 
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例Hironobu Isoda
 
RICOH THETA プラグイン開発 ワークショップ #1
RICOH THETA プラグイン開発 ワークショップ #1RICOH THETA プラグイン開発 ワークショップ #1
RICOH THETA プラグイン開発 ワークショップ #1RICOHTHETAPluginDevloperCommunity
 
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決オラクルエンジニア通信
 
Git超入門_座学編.pdf
Git超入門_座学編.pdfGit超入門_座学編.pdf
Git超入門_座学編.pdf憲昭 村田
 
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組みJJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み日本Javaユーザーグループ
 
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26Yahoo!デベロッパーネットワーク
 
5月中旬の仮想通貨Re-orgについて
5月中旬の仮想通貨Re-orgについて5月中旬の仮想通貨Re-orgについて
5月中旬の仮想通貨Re-orgについてMasanori Kusunoki
 
Introduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMIntroduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMKoichi Sakata
 
こんな辛いテストはいやだ
こんな辛いテストはいやだ こんな辛いテストはいやだ
こんな辛いテストはいやだ Takuya Mikami
 
Java 10でぼくたちの生活はどう変わるの?
Java 10でぼくたちの生活はどう変わるの?Java 10でぼくたちの生活はどう変わるの?
Java 10でぼくたちの生活はどう変わるの?Yuji Kubota
 
RETEアルゴリズムを使いこなせ
RETEアルゴリズムを使いこなせRETEアルゴリズムを使いこなせ
RETEアルゴリズムを使いこなせMasahiko Umeno
 
JavaOne 2015 JDK Update (Jigsaw) #j1jp
JavaOne 2015 JDK Update (Jigsaw) #j1jpJavaOne 2015 JDK Update (Jigsaw) #j1jp
JavaOne 2015 JDK Update (Jigsaw) #j1jpYuji Kubota
 
【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~
【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~ 【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~
【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~ Yuya Ohara
 

Similar to GCを発生させないJVMとコーディングスタイル (20)

Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要
 
【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた
【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた
【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた
 
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
 
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
 
CPUから見たG1GC
CPUから見たG1GCCPUから見たG1GC
CPUから見たG1GC
 
Microprofileでエンタープライズ品質
Microprofileでエンタープライズ品質Microprofileでエンタープライズ品質
Microprofileでエンタープライズ品質
 
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
 
RICOH THETA プラグイン開発 ワークショップ #1
RICOH THETA プラグイン開発 ワークショップ #1RICOH THETA プラグイン開発 ワークショップ #1
RICOH THETA プラグイン開発 ワークショップ #1
 
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
(Tech DeepDive #1) Java Flight Recorder を活用した問題解決
 
Git超入門_座学編.pdf
Git超入門_座学編.pdfGit超入門_座学編.pdf
Git超入門_座学編.pdf
 
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組みJJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
 
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
 
5月中旬の仮想通貨Re-orgについて
5月中旬の仮想通貨Re-orgについて5月中旬の仮想通貨Re-orgについて
5月中旬の仮想通貨Re-orgについて
 
Kubernetes Cluster Adminやってました #con_rider
Kubernetes Cluster Adminやってました #con_riderKubernetes Cluster Adminやってました #con_rider
Kubernetes Cluster Adminやってました #con_rider
 
Introduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMIntroduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVM
 
こんな辛いテストはいやだ
こんな辛いテストはいやだ こんな辛いテストはいやだ
こんな辛いテストはいやだ
 
Java 10でぼくたちの生活はどう変わるの?
Java 10でぼくたちの生活はどう変わるの?Java 10でぼくたちの生活はどう変わるの?
Java 10でぼくたちの生活はどう変わるの?
 
RETEアルゴリズムを使いこなせ
RETEアルゴリズムを使いこなせRETEアルゴリズムを使いこなせ
RETEアルゴリズムを使いこなせ
 
JavaOne 2015 JDK Update (Jigsaw) #j1jp
JavaOne 2015 JDK Update (Jigsaw) #j1jpJavaOne 2015 JDK Update (Jigsaw) #j1jp
JavaOne 2015 JDK Update (Jigsaw) #j1jp
 
【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~
【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~ 【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~
【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~
 

More from Kenji Kazumura

Jakarta EE 9 と これから
Jakarta EE 9 と これからJakarta EE 9 と これから
Jakarta EE 9 と これからKenji Kazumura
 
JakartaOne Livestream Japan 2020
JakartaOne Livestream Japan 2020JakartaOne Livestream Japan 2020
JakartaOne Livestream Japan 2020Kenji Kazumura
 
Versatil Javaチューニング
Versatil JavaチューニングVersatil Javaチューニング
Versatil JavaチューニングKenji Kazumura
 
Challenge for GlassFish Builpack
Challenge for GlassFish BuilpackChallenge for GlassFish Builpack
Challenge for GlassFish BuilpackKenji Kazumura
 
Python + GDB = Javaデバッガ
Python + GDB = JavaデバッガPython + GDB = Javaデバッガ
Python + GDB = JavaデバッガKenji Kazumura
 
JavaDayTokyo2015 [3-1]
JavaDayTokyo2015 [3-1]JavaDayTokyo2015 [3-1]
JavaDayTokyo2015 [3-1]Kenji Kazumura
 
Javaでトランザクショナルメモリを使う
Javaでトランザクショナルメモリを使うJavaでトランザクショナルメモリを使う
Javaでトランザクショナルメモリを使うKenji Kazumura
 

More from Kenji Kazumura (8)

Jakarta EE 9 と これから
Jakarta EE 9 と これからJakarta EE 9 と これから
Jakarta EE 9 と これから
 
JakartaOne Livestream Japan 2020
JakartaOne Livestream Japan 2020JakartaOne Livestream Japan 2020
JakartaOne Livestream Japan 2020
 
Versatil Javaチューニング
Versatil JavaチューニングVersatil Javaチューニング
Versatil Javaチューニング
 
microprofile
microprofilemicroprofile
microprofile
 
Challenge for GlassFish Builpack
Challenge for GlassFish BuilpackChallenge for GlassFish Builpack
Challenge for GlassFish Builpack
 
Python + GDB = Javaデバッガ
Python + GDB = JavaデバッガPython + GDB = Javaデバッガ
Python + GDB = Javaデバッガ
 
JavaDayTokyo2015 [3-1]
JavaDayTokyo2015 [3-1]JavaDayTokyo2015 [3-1]
JavaDayTokyo2015 [3-1]
 
Javaでトランザクショナルメモリを使う
Javaでトランザクショナルメモリを使うJavaでトランザクショナルメモリを使う
Javaでトランザクショナルメモリを使う
 

GCを発生させないJVMとコーディングスタイル

  • 2. .setName(“数村憲治”) .setDirectorOf(“Eclipse Foundation Board”) .setMemberOf(“Jakarta EE Committee”) .setMemberOf(“JCP Executive Committee”) .setTwitter(“@kkzr”) .setResponsibleFor(“Launcher”) .build(); スピーカー Copyright 2018 FUJITSU LIMITED Speaker me = SpeakerBuilder 1
  • 3. アジェンダ Copyright 2018 FUJITSU LIMITED GC問題 アプリケーションによる対処 コンパイラによる対処 サマリ 2
  • 4. アジェンダ Copyright 2018 FUJITSU LIMITED GC問題 アプリケーションによる対処 コンパイラによる対処 サマリ 3
  • 5. 何が問題か Copyright 2018 FUJITSU LIMITED 健康診断シンドローム アプリケーションの実行が止まる アプリケーションに割り当てられるCPU時間が減る 実はたいした問題ではない 4 スループット レスポンス
  • 6. なぜ問題か Copyright 2018 FUJITSU LIMITED (Cでは、malloc/free回数に依存) チューニングがたいへん 最適解をみつけるのが難しい 環境が変わるとやりなおし 見積もりができない GC時間は残存オブジェクトに依存 5
  • 7. 問題の対処方法 Copyright 2018 FUJITSU LIMITED あきらめる SLAの妥協 Javaを使わない オブジェクトの 生成数・量を減らす アプリケーションで頑張る GCで頑張る コンパイラで頑張る 優秀なGCを作る オブジェクトの 生成を最適化 6
  • 8. デモ Copyright 2018 FUJITSU LIMITED7 Node.js $ node –trace-gc node.js $ graalvm-ce-1.0.0-rc10/bin/node --jvm.Xmx16m --jvm.Xms16m --jvm.verbose:gc node.js
  • 9. アジェンダ Copyright 2018 FUJITSU LIMITED GC問題 アプリケーションによる対処 コンパイラによる対処 サマリ 8
  • 10. アプリケーションで頑張る Copyright 2018 FUJITSU LIMITED オブジェクトプール (キャッシュ) スレッドプール コネクションプール 小ネタ ArrayList 拡張 String.intern() Boxing/Unboxing 9
  • 11. Integer AutoBoxing Copyright 2018 FUJITSU LIMITED10 public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } キャッシュの範囲はプロパティで指定可能 java.lang.Integer.IntegerCache.high よく使われる範囲はIntegerオブジェクトの使いまわし Integer.java
  • 12. プーリングコスト Copyright 2018 FUJITSU LIMITED 1*(メモリ割当+初期化) + p*GCp n*(メモリ割当+初期化) + u*GCu プーリング使用時 プーリング不使用時 n: トランザクション回数 p: プーリング使用時のGC回数 u: プーリング不使用時のGC回数 GCp: プーリング使用時の1回のGC時間 GCu: プーリング不使用時の1回のGC時間 p < u GCp > GCu 初期化 < n*初期化 メモリ割当は問題にならない 11 一般的な傾向
  • 13. Edenからのアロケーション Copyright 2018 FUJITSU LIMITED o = new Object(); bottom top end lock(Eden); top = top + size; unlock(Eden); Bump The Pointer bottom top end 12 size
  • 14. TLAB (Thread-Local Allocation Buffer) Copyright 2018 FUJITSU LIMITED スレッド1スレッド2 Eden領域をスレッドごとに分割して割当て ロックが不要に 13 lock(Eden); top = top + size; unlock(Eden);
  • 15. Fast Allocation Copyright 2018 FUJITSU LIMITED https://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf only requiring around 10 native instructions Memory Management in the Java HotSpot Virtual Machine Bump the Pointer + TLAB で実現 14
  • 16. デモ Copyright 2018 FUJITSU LIMITED15 Bump The Pointer $ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp -XX:CompileCommand=compileonly,Bump.doIt -XX:-UseTLAB Bump $ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp -XX:CompileCommand=compileonly,Bump.doIt Bump (注)PrintAssemblyを使うには、hsdisが必要。https://github.com/liuzhengyang/hsdis
  • 17. TLABが向かないケース Copyright 2018 FUJITSU LIMITED スレッド N+1 用のTLABが割当てられない スレッド1スレッド2 スレッドN ・・・ スレッド数が多く、かつ、オブジェクト生成量が少ない場合 16
  • 18. デモ Copyright 2018 FUJITSU LIMITED17 Thread-Local Allocation Buffer $ java -Xmx32m -Xms32m -verbose:gc TLAB $ java -Xmx32m -Xms32m -verbose:gc -XX:-UseTLAB TLAB
  • 19. アジェンダ Copyright 2018 FUJITSU LIMITED GC問題 アプリケーションによる対処 コンパイラによる対処 サマリ 18
  • 20. デモ Copyright 2018 FUJITSU LIMITED19 メモリアロケーション量とGC頻度 $ java -Xmx32m -Xms32m -verbose:gc EA
  • 21. Escape Analysis (EA) Copyright 2018 FUJITSU LIMITED https://docs.oracle.com/javase/8/docs/technotes/guides/vm/performance- enhancements-7.html JDK 6 (HotSpot C2) から採用 JITによる最適化 Scalar Replacement Stack Allocation Lock Elision 20
  • 22. Escapeとは Copyright 2018 FUJITSU LIMITED メソッドからの脱出 オブジェクトがアロケートされたメソッドの外で 使用されているかもしれない オブジェクトはメソッドローカルでない スレッドからの脱出 オブジェクトがアロケートされたスレッドの外で 使用されているかもしれない 他のスレッドがそのオブジェクトにアクセスするかもしれない 21
  • 23. Escapeの種類 Copyright 2018 FUJITSU LIMITED オブジェクトはグローバルに脱出する オブジェクトは作成したメソッドを脱出しない オブジェクトは引数経由でメソッドを脱出するが、 スレッドは脱出しない NoEscape ArgEscape GlobalEscape 22
  • 24. Escapeの例 Copyright 2018 FUJITSU LIMITED int foo(String name) { Person person = new Person(name); return person.id(); } void foo(String name) { Person person = new Person(name); register(person); } NoEscape ArgEscape 23
  • 25. Escapeの例 Copyright 2018 FUJITSU LIMITED class bar { Person person; void foo(String name) { person = new Person(name); } } GlobalEscape 24
  • 26. 最適化の組み合わせ Copyright 2018 FUJITSU LIMITED Scalar Replacement Stack Allocation Lock Elision No Escape 〇 〇 〇 Arg Escape - - 〇 Global Escape - - - 25
  • 27. Stack Allocation Copyright 2018 FUJITSU LIMITED オブジェクトをヒープではなくスタックにアロケートする メソッド終了と同時にオブジェクトは解放 HotSpotでは不採用 26
  • 28. Stack Allocation Copyright 2018 FUJITSU LIMITED ヘッダ 32 山田 太郎 SP メソッド 開始時 new Person() 実行後 メソッド 終了時 残骸 SP SP 27 void foo { Person person = new Person(32, “山田太郎”); ・・・ スタック
  • 29. Scalar Replacement Copyright 2018 FUJITSU LIMITED オブジェクトフィールドへのアクセスを、 スタックまたはレジスターアクセスにする Stack Allocationとは異なり、 オブジェクトヘッダー等はアロケートされない 28
  • 30. Scalar Replacement 例 Copyright 2018 FUJITSU LIMITED int foo(String name, int age) { Person person = new Person(name, age); return person.getAge(); } class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } } 29
  • 31. デモ Copyright 2018 FUJITSU LIMITED30 Scalar Replacement $ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=print,ScalarReplace.doIt -XX:-DoEscapeAnalysis ScalarReplace $ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=print,ScalarReplace.doIt -XX:+DoEscapeAnalysis ScalarReplace $ java -verbose:gc -Xmx32m -Xms32m -XX:CompileCommand=dontinline,ScalarReplace.getPersonId ScalarReplace
  • 32. Lock Elision Copyright 2018 FUJITSU LIMITED スレッドローカルなオブジェクトに対するロックを削除 31 void foo() { Object lock = new Ojbect(); synchronized (lock) { //doSomething }; }
  • 33. アジェンダ Copyright 2018 FUJITSU LIMITED GC問題 アプリケーションによる対処 コンパイラによる対処 サマリ 32
  • 34. サマリ Copyright 2018 FUJITSU LIMITED GCの問題と対処 JVMの種類やインライン状況によっては、 GCが発生したり、しなかったり 33 まずは、見やすいコードを GCは日々改善されている Javaのアロケーションコストは低い EAによるメモリ最適化もあり
  • 35. Copyright 2018 FUJITSU LIMITED Q/A 34